代码之家  ›  专栏  ›  技术社区  ›  Voldy

从WWW浏览器自动检测区域设置并使用Cucumber进行测试

  •  3
  • Voldy  · 技术社区  · 15 年前

      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'
    

    我已经试着在家里做了 步骤定义文件夹中的语句:

    Before do
      request.env['HTTP_ACCEPT_LANGUAGE'] = "en"
    end
    

    但我还有一个错误:

      undefined method `env' for nil:NilClass (NoMethodError)
    

    有人知道如何初始化/模拟吗 request.env['HTTP\u ACCEPT\u LANGUAGE'] 黄瓜?


    更新

    当我重写时,黄瓜测试通过了 设置语言环境 方法:

      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
    

    这不是一个解决方案,但它是有效的。

    2 回复  |  直到 15 年前
        1
  •  4
  •   zetetic    15 年前

    事实上,问题在于网络鼠,而不是黄瓜。事件的顺序是(大致)

    • 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是如何组合在一起的。

        2
  •  2
  •   Voldy    15 年前

    另一种方式是“相同,但不同”。您可以在步骤定义文件中添加before语句:

    Before do
      header 'Accept-Language', 'en-US' 
    end
    

    这将在每个场景之前执行,并保持清晰。