使用I18n惰性查找在rspec中测试助手

时间:2014-02-14 08:23:12

标签: ruby-on-rails rspec internationalization rails-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.

如何解决这个问题?提前谢谢。

2 个答案:

答案 0 :(得分:12)

有时您可以设置所需的虚拟路径,以便translate知道如何使用快捷方式。

辅助规范

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

现在t('.word')查找admin.path.form.word

答案 1 :(得分:1)

如果你把它作为:

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设置为使用预期路径,就像在主代码中一样,我认为这是一种更好的方法。