Помощник по тестированию в rspec с ленивым поиском I18n

Рассмотрим этот пример. У меня есть модель продукта, в которой есть discount_percentage. И мы поддерживаем несколько локалей. В представлении мы не хотим, чтобы элементы i18n портили представление. Поэтому мы делаем помощника для лучшего чтения и, возможно, повторно используем его в других представлениях: render_product_discount (код см. ниже), который будет отображать статус скидки для этого продукта. И мы используем функцию ленивого поиска i18n во всем приложении. Но когда мы хотим протестировать этот вспомогательный метод, мы получаем ошибку:

# RuntimeError:
# Cannot use t(".product_discount") shortcut because path is not available

потому что для помощника перевода нет path, чтобы расширить ключ ленивого перевода.

Ожидаемый результат: Этот продукт имеет скидку 20%.

Имя помощника: render_product_discount

def render_product_discount
  t('.product_discount', discount_percentage: product.discount_percentage)
end

# es.yml
es:
  products:
    show:
      product_discount: Este producto tiene un %{discount_percentage} descuento.

# en.yml
en:
  products:
    show:
      product_discount: This product has %{discount_percentage} discount.

Как обойти это? Заранее спасибо.


person Juanito Fatas    schedule 14.02.2014    source источник


Ответы (2)


если вы заглушите t как:

helper.stub(:t).with('.product_discount', discount_percentage: product.discount_percentage) { "This product has #{product.discount_percentage}% discount." }

вы можете протестировать с помощью:

expect(helper.render_product_discount).to eq("This product has #{product.discount_percentage}% discount.")

Изменить
Как ответил SebastianG, вы можете установить @virtual_path с ожидаемым путем для использования, как в основном коде, и я думаю, что это лучший подход, когда это возможно.

person Doguita    schedule 26.02.2014

Иногда вы можете указать нужный виртуальный путь, чтобы переводчик знал, как использовать ярлыки.

В спецификациях помощника

before { helper.instance_variable_set(:@virtual_path, "admin.path.form") }

Теперь t('.word') ищет admin.path.form.word.

person Sebastian vom Meer    schedule 14.05.2014
comment
Это все еще работает в Rails 4.2? Кажется, я не могу заставить его работать. - person Joshua Muheim; 24.03.2015
comment
С 4.2 еще не тестировал, извините. - person Sebastian vom Meer; 24.03.2015
comment
Я думаю, что моя проблема немного отличается, взгляните на этот пост, который я создал: stackoverflow.com/questions/29229368/ - person Joshua Muheim; 24.03.2015
comment
Извините, я понятия не имею, как решить вашу проблему. Однако последняя версия Rails по-прежнему использует переменную экземпляра virtual_path: noreferrer">github.com/rails/rails/blob/ - person Sebastian vom Meer; 24.03.2015
comment
Я знаю, я добавил туда точку останова, поэтому обнаружил, что @virtual_path не установлен. Спасибо, в любом случае. - person Joshua Muheim; 24.03.2015