Как подделать метод в Rails Minitest

Я пытаюсь подделать ответ на вызов метода, но безуспешно.

В моих тестах отображаемая в html страница будет показывать количество страниц из. вызов <%= @pagy.pages %> (я использую гем Pagy), но в моем тесте мне не нужно считать страницы, только чтобы проверить, была ли страница открыта.

Таким образом, @pagy никогда не инициализировался в тесте.

Мне нужно, чтобы Minitest «подделывал» ответ на @pagy.pages, чтобы всегда отвечать на номер 1:

Как это сделать?

Спасибо!


После ответа @Ahmed это новый код, но он все еще не работает:

    mock = MiniTest::Mock.new
    mock.expect :pages, 1

    Pagy.stub :new, mock do
      create :lando, :brazilo
      get '/ameriko/brazilo'
      assert_response :success
    end

Представление по-прежнему не может найти метод @pagy.pages.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
189
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать Minitest Mocks в блоке setup (также может работать, если вы поместите этот код внутри самого блока тестового примера):

mock = Minitest::Mock.new
mock.expect :pages, 1

Pagy.stub :new, mock do
  # Put the code that relies on `@pagy.pages` is `1`
end

Обратный след:

Minitest::UnexpectedError: ActionView::Template::Error: undefined method `pages' for nil:NilClass
    app/views/events/_events_as_cards.haml:11:in `_app_views_events__events_as_cards_haml__846217806806687455_70361502341700'
    app/helpers/events_helper.rb:27:in `display_events_by_style'
    app/views/events/by_country.haml:20:in `_app_views_events_by_country_haml__4566190630208235120_70361501243420'
    test/controllers/events_controller_test.rb:41:in `block (2 levels) in <class:EventsControllerTest>'
    test/controllers/events_controller_test.rb:39:in `block in <class:EventsControllerTest>'
app/views/events/_events_as_cards.haml:11:in `_app_views_events__events_as_cards_haml__846217806806687455_70361502341700'
app/helpers/events_helper.rb:27:in `display_events_by_style'
app/views/events/by_country.haml:20:in `_app_views_events_by_country_haml__4566190630208235120_70361501243420'
test/controllers/events_controller_test.rb:41:in `block (2 levels) in <class:EventsControllerTest>'
test/controllers/events_controller_test.rb:39:in `block in <class:EventsControllerTest>'
Finished in 1.53247s
1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
I, [2019-07-15T10:00:50.384204 #47531]  INFO -- : Running locally, skipping Codacy coverage

Process finished with exit code 1

Все равно ничего хорошего. МиниТест ответил: Minitest::UnexpectedError: ActionView::Template::Error: undefined method `pages' for nil:NilClass

Fernando 13.07.2019 00:21

Можете ли вы опубликовать полный backtrace? или хотя бы строку, в которой произошла ошибка.

Ahmed Samir Shahin 15.07.2019 09:46

Я добавил обратную связь. Я уже нашел решение для своего теста (создание НАСТОЯЩЕГО экземпляра @pagy), но мне все еще нужно понять, что я делал неправильно с Mock и Stub.

Fernando 15.07.2019 15:02

Это потому, что вам нужно установить @pagy переменную экземпляра контроллера перед запуском тестовой спецификации: controller.instance_variable_set(:@pagy, your_mock_variable)

Ahmed Samir Shahin 16.07.2019 10:12

Другие вопросы по теме