我用Cucumber测试了我的应用程序,并且在我从application_controller.rb中的WWW浏览器添加自动检测语言环境之前,它可以正常工作:
before_filter :set_locale
private
def set_locale
xxx = request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
if xxx.match /^(en|fr)$/
I18n.locale = xxx
else
I18n.locale = 'en'
end
end
我有一个场景:
Scenario: Successful sign up
Given I am an anonymous user
And I am on the home page
When ...
当我运行黄瓜时,出现错误:
Given I am an anonymous user # features/step_definitions/user_steps.rb:7
And I am on the home page # features/step_definitions/webrat_steps.rb:6
private method `scan' called for nil:NilClass (NoMethodError)
C:/workspace/jeengle/app/controllers/application_controller.rb:33:in `set_locale'
c:/worktools/ruby/lib/ruby/1.8/benchmark.rb:308:in `realtime'
(eval):2:in `/^I am on (.+)$/'
features/manage_users.feature:8:in `And I am on the home page'
我已尝试在step_definitions文件夹中的语句之前在中执行此操作:
Before do
request.env['HTTP_ACCEPT_LANGUAGE'] = "en"
end
但是我还有另一个错误:
undefined method `env' for nil:NilClass (NoMethodError)
有人知道如何在黄瓜中初始化/模拟 request.env ['HTTP_ACCEPT_LANGUAGE'] 吗?
更新了
当我重新编写 set_locale 方法时,黄瓜测试通过:
xxx = request.env['HTTP_ACCEPT_LANGUAGE']
if xxx
xxx = xxx.scan(/^[a-z]{2}/).first
if xxx.match /^(en|ru)$/
I18n.locale = xxx
end
else
I18n.locale = 'en'
end
这不是解决方案,但可以。
最佳答案
实际上问题出在Webrat,而不是Cucumber。事件的顺序大致是
显然,Webrat在构建请求时不会添加此标头。但是,Webrat提供了一种解决方法:“标头”方法,使用该方法可以在请求期间设置任何标头。
因此,要进行这项工作,请在标题中添加一个步骤,例如:
Given /^an Accept Language header$/ do
header "Accept-Language", "en;en-us" # or whatever value you need for testing
end`
在访问页面之前,请运行此步骤,并且Webrat不再混乱。
顺便说一句,我是从The Rspec Book那里得到的,它确实很好地解释了BDD东西如何组合在一起。