我用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构造一个请求并将其发送到控制器
  • 步骤失败,因为请求没有“Accept-Language”标头

  • 显然,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东西如何组合在一起。

    10-07 20:31