由于错误的默认语言环境,我的Rails应用程序的规范随机失败

时间:2016-03-16 15:51:24

标签: ruby-on-rails ruby rspec rspec-rails rails-i18n

我的Rails应用程序的某些规格似乎随机失败,因为突然英语不再是默认语言,而是德语:

1 << 3

可以看出,“人人享有”这一部分突然间是“Zugangfüralle”。我搜索了一个解决方案,似乎I18n.locale is a global object, so when it's changed in a spec, it persists

问题并不总是发生,但我可以在指定这样的种子时重现它: expected: "Project test customer - Project test name (Audit, Access for all, 2015-06-15).pdf" got: "Project test customer - Project test name (Audit, Zugang für alle, 2015-06-15).pdf" 。因此,在某些其他规范之前(或之后)执行规范似乎确实存在一些问题。

我有一个功能规范,用于测试是否可以更改语言环境,如下所示:

rspec --seed 51012

我怀疑这可能是有问题的规范,当它提前运行时,它会对其他规格产生影响。

我希望我可以通过将规范中的语言设置回默认值来解决它:

it 'offers contents in german' do
  visit root_path(locale: :de)

  expect(page).to have_content 'Willkommen'
end

没有用,这个也没有:

it 'offers contents in german' do
  visit root_path(locale: :de)

  expect(page).to have_content 'Willkommen'

  I18n.locale = :en
end

我现在有点无能为力。我怎么能调试这种情况,所以我肯定找到问题的根源并修复它(或者至少解决它)?

更新

使用Dave的答案(it 'offers contents in german' do visit root_path(locale: :de) expect(page).to have_content 'Willkommen' visit root_path(locale: :en) end )我发现了问题。

rspec --bisect

根据运行这些规范的顺序,对于以下规范,区域设置设置为# application_controller_spec.rb describe ApplicationController do controller(ApplicationController) do def index render text: 'Hello World' end end describe 'locale parameter' do it 'is set to english when not available in the request' do get :index expect(I18n.locale).to eq :en end it 'can be set through the request' do get :index, locale: :de expect(I18n.locale).to eq :de end end end :de

我用BoraMa建议的代码片段修复了它:

:en

我仍然有点惊讶RSpec / Rails不会自动执行此操作......

1 个答案:

答案 0 :(得分:4)

注释掉您怀疑的规范并运行rspec --seed 51012。如果通过,你知道罪魁祸首。

如果没有,这看起来像是rspec --bisect的工作。做

rspec --seed 51012 --bisect

让RSpec找到重现失败的最小范例(可能是2)。然后,您可以决定如何处理罪魁祸首。

此功能在RSpec 3.3中可用,在RSpec 3.4中更好。更多信息:https://relishapp.com/rspec/rspec-core/docs/command-line/bisect