2012-07-12 52 views
1

我有特點文件api_extensions.rb /支持:黃瓜:支持文件中定義的實例變量沒有被傳遞到步驟定義

require 'rubygems' 
require 'mechanize' 
require 'json' 

module ApiExtensions 

    def initialize 
     @agent = Mechanize.new 
     @api_header = {'Accept' => 'application/json', 'Content-Type' => 'application/json'} 
     @api_uris = { 
      'the list of campuses' => 'http://example.com/servicehosts/campus.svc', 
      'the list of settings' => 'http://example.com/servicehosts/setting.svc', 
      'login' => 'http://example.com/servicehosts/Student.svc/login', 
     }  
    end 
end 

World(ApiExtensions) 

不過,我仍然得到錯誤undefined method '[]' for nil:NilClass (NoMethodError)上的第二行步定義文件當我運行黃瓜:

When /^I attempt to log in using a valid username and password$/ do 
    api_uri = @api_uris['login'] 
    request_body = {:username => "[email protected]", :password => "testsecret"}.to_json 
    @page = @agent.post(api_uri, request_body, @api_header) 
end 

爲什麼實例變量@api_uris沒有顯示出來,即使我已經加入了模塊的世界?另外,我已經測試了通過向該文件添加一些檢測工具來執行該模塊,因此@api_uris正在設置中,它僅用於我的步驟定義。

最後,如果我明確指出include ApiExtensions作爲我的步驟定義文件的第一行,它可以正常工作。但我認爲呼籲World(ApiExtensions)應該自動將我的模塊包含在所有步驟定義文件中。

謝謝!

回答

3

問題:我的理解是,World(ApiExtensions)正在擴展世界對象(請參閱https://github.com/cucumber/cucumber/wiki/A-Whole-New-World)。此擴展將使ApiExtensions方法(即您的initialize())現在可用於您的步驟。在實例變量被創建之前,您仍然需要實際調用初始化方法,並可用於所有步驟。如果您在步驟開始時添加initialize,那麼您的步驟應該起作用。

解決方案: 如果要初始化這些實例變量擴大世界的時候,你應該將模塊更改爲:

module ApiExtensions 
    def self.extended(obj) 
     obj.instance_exec{ 
      @agent = Mechanize.new 
      @api_header = {'Accept' => 'application/json', 'Content-Type' => 'application/json'} 
      @api_uris = { 
       'the list of campuses' => 'http://example.com/servicehosts/campus.svc', 
       'the list of settings' => 'http://example.com/servicehosts/setting.svc', 
       'login' => 'http://example.com/servicehosts/Student.svc/login', 
      } 
     } 
    end 
end 

當世界對象與你的模塊延伸的self.extended(obj)方法立即運行並初始化所有變量,使其可用於所有步驟。