Как вызвать "time_ago_in_words" из FunctionalTest?

Я использую функцию time_ago_in_words в представлении, и мне нужно проверить результат в FunctionalTest.

Но тест не может видеть вспомогательную функцию time_ago_in_words.

Что мне делать, чтобы использовать эти вспомогательные методы из FunctionalTests?

Ответы

Ответ 1

Включите модуль ActionView::Helpers::DateHelper в файлы test_helper.rb или test.rb. И что это, с тестовой консоли:

>> time_ago_in_words(3.minutes.from_now)
NoMethodError: undefined method `time_ago_in_words' for #<Object:0x3b0724>
from (irb):4
from /Users/blinq/.rvm/rubies/ruby-1.9.1-p376/bin/irb:15:in `<main>'
>> include ActionView::Helpers::DateHelper
=> Object
>> time_ago_in_words(3.minutes.from_now)
=> "3 minutes"

Ответ 2

Недавно у меня была аналогичная проблема, когда я пытался получить доступ к этой функции из API, поэтому я завернул ее в драгоценный камень, называемый timeywimey. Проверьте это: https://github.com/onetwopunch/timeywimey#usage

Он позволяет вам получить доступ к этому помощнику из любого места в проекте Rails, а также в Sinatra и в собственном проекте ruby.

Ответ 3

Я добавил в rails_helper.rb

config.include ActionView::Helpers::DateHelper

и работа, спасибо @jpemberthy!

Ответ 4

Что именно вы пытаетесь протестировать? Вам не нужно проверять поведение самого time_ago_in_words, потому что это связано с собственными тестами Rails. Если вы тестируете один из ваших собственных помощников, который использует time_ago_in_words, вывод может быть проверен в вспомогательном тесте (который наследуется от ActionView::TestCase).

Функциональные тесты предназначены для проверки поведения контроллеров (какой шаблон они визуализируют, разрешают ли они доступ, перенаправление и т.д.), которые могут включать проверку наличия определенных тегов HTML (по id). Обычно я стараюсь не использовать их для проверки содержимого тегов.