在RSpec2控制器测试(使用render_views)中,找到视图实例

时间:2012-12-27 21:31:17

标签: ruby-on-rails-3 view internationalization controller rspec2

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

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

要做到这一点,我想要存根i18n翻译方法(I18n #t)。

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

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

我尝试过(以各种方式)#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。

1 个答案:

答案 0 :(得分:0)

即使在找到合适的物体之后,神秘的RSpec顽固(或者我认为)正在打破其他测试:

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

相反,我成功使用了:

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

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

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

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