Как добавить ожидание мокко, что будет вызван вспомогательный метод? - PullRequest
1 голос
/ 13 декабря 2010

Я перемещаю метод из контроллера в помощника;метод теперь будет вызываться из представления.Ранее в моем контроллере у меня было

def show
  @things = gather_things
end

, а в моем функциональном тесте у меня было

test "show assigns things" do
  get :show
  assert_equal GATHERED_THINGS, assigns(:things)
end

, теперь gather_things живет в помощнике и вызывается из представления.У меня есть модульный тест для помощника, который гарантирует, что он возвращает правильные значения, но я хочу, чтобы мой функциональный тест утверждал, что он вызывается.Я пробовал

test "show calls gather_things" do
  @controller.expects(:gather_things)
  get :show
end

, но это не работает.На что мне звонить expects(:gather_things)?

1 Ответ

1 голос
/ 21 августа 2012

Если вы переместили код из контроллера в View, то он фактически вышел за рамки функционального теста.

Я не знаю правильный класс, на который можно рассчитывать ... но вы, вероятно, сможете это выяснить, в методе "collect_things" сделайте что-то вроде: logger.error self.class.name - который выложит имя класса в журнал для вас. Тогда вы можете поместить свои ожидания в этот класс.

Теперь мы подошли к сути вопроса ... Вы бы переместили этот код в представление?

Мое мнение, что вы не должны. Настройка набора объектов модели - это именно то, что должно идти в коде контроллера - что если вы позже решите, что хотите отобразить те же данные в файле CSV, или в виде RESTful xml API? - вам все еще нужен один и тот же набор объектов, независимо от того, какое представление вы используете. Поэтому моя окончательная рекомендация - перенести этот метод обратно в контроллер, где он и должен быть.

Редактировать: подписка теперь является устаревшим советом и не относится к этому пользователю, но может относиться к другим

Если вы тестируете с использованием rspec - он фактически не отображает представления во время функционального теста (если вы не включили его специально), и поэтому любой код, называемый представлениями формы, не будет выполняться.

Если вы хотите проверить, что View вызывает что-то, вам нужно либо включить это, либо проверить это в ваших view-тестах.

...