Мокко ожидается максимум один раз, вызывается дважды, но метод явно вызывается только один раз
Я использую Мокко для пробного тестирования. Ниже приведен соответствующий код:
# test_player.rb
should "not download the ppg more than once for a given year" do
@durant.expects(:fetch_points_per_game).at_most_once
ppg = @durant.points_per_game
ppg2= @durant.points_per_game
assert_equal ppg, ppg2, "A player should have a points per game"
end
# player.rb
class Player
# ...
def points_per_game(year=Date.today.year)
@points_per_game ||= fetch_points_per_game(year)
end
alias_method :ppg, :points_per_game
private
def fetch_points_per_game(year=Date.today.year)
31.2
end
end
Тест не пройден, и он пожаловался на "неожиданный вызов: #.fetch_points_per_game(any_parameters)"
Насколько я понимаю, мой код: если @point_per_game равен nil, вызывается fetch_points_per_game, в противном случае результат кэшируется для будущих вызовов points_per_game. Так почему же тест жалуется на то, что fetch_points_per_game был вызван дважды?
1 ответ
Вы ожидаете, что вы не указываете возвращаемое значение, поэтому вызов с заглушкой возвращает nil. Вот почему он вызывается во второй раз. Если вы измените ожидание на:
@durant.expects(:fetch_points_per_game).at_most_once.returns(1.23)
Вы должны найти, что тесты теперь проходят.