1

我正在编写一个缺少翻译查找的测试——而且我是 RSpec 的初学者。换句话说,我正在编写一个规范,在视图中,所有可见文本都通过 translate 方法传递。

我指的不是缺少翻译,而是缺少翻译查找(源代码缺少对#t 或#translate 方法的调用)。

为此,我想存根 i18n 翻译方法 (I18n#t)。

为此,我如何找到 RSpec2 正在使用的视图实例?此视图实例包括模块 ActionView::Helpers::TranslationHelper。如果我可以访问该视图对象,我可以(我认为)存根它的翻译方法。顺便说一句,我想我应该从@controller 开始。

规范中的所有其他内容都以通常的方式工作(包括失败的测试),除了查找和存根视图的翻译帮助器方法#t。我正在使用渲染视图。

我尝试过(以各种方式)#helper、#translate 和#view。也许我错过了什么?

在 ObjectSpace 中(在我的测试中)使用方法#translate 搜索所有对象,我能够抓取该对象,因为它的类是 I18n::Backend::Simple。所以我的规范有效,但如果代码不必搜索 ObjectSpace 的话,它可能会快得多!

作为背景,到目前为止,最简单的测试计划似乎是在 RSpec 控制器测试中循环遍历每个控制器的操作,并寻找可见的字母字符。首先,将 Rails 翻译助手存根以返回空字符串。此外,还可以去除标签名称以及任何脚本和样式标签。

我的 Gemfile 包括 capybara 1.1.4、capybara-webkit 0.12.1、factory_girl 4.1.0、factory_girl_rails 4.1.0、rails 3.2.9、rspec 2.12.0、rspec-rails 2.12.0。

4

1 回答 1

0

即使在找到正确的对象之后,神秘的 RSpec 的存根(或者我认为)正在破坏其他测试:

before(:each) { object.stub   :translate, true }
after( :each) { object.unstub :translate       }

相反,我成功地使用了:

  • I18n::Backend::Simple 的实例方法#translate 上的 Alias_method_chain 和
  • 一个 Ruby 全局变量,用于将 #translate 切换为空字符串模式。

后来我得出结论,很可能是 Formtastic 的 i18n 缓存破坏了其他测试。为了解决这个问题,正确的设置(在 config/initializers/formtastic.rb 中)是:

Formtastic::FormBuilder.i18n_cache_lookups = ! (Rails.env.development? || Rails.env.test?)

不过,我仍然没有找到视图实例。这就是我想知道的问题!所以,请给我答案,我会接受一个有效的。

于 2012-12-30T01:45:01.483 回答