2012-09-07 55 views
1

我是rspec的新手,我想了解如何編寫一些特定的測試。如何編寫特定的rspec測試?需要的建議...

背景:

  • 我測試西納特拉應用
  • 相應的應用連接到多個數據庫
  • 我定義的用戶名/這些數據庫爲環境變量的密碼,我引用這些變量在代碼中。

我有工作測試,所以我知道如何測試環境變量的存在。

我是這樣做的:

27  it "should know the username for each SUBDOMAIN in the list" do 
28  @dm.domains.each do |dom| 
29   ENV['C_USERNAME_' + dom].nil?.should eq(false) 
30  end 
31  end 

正如我所說的,測試工作。唯一的問題是,當它失敗時,它不清楚哪個dom沒有設置環境變量。失敗的測試的結果看起來如下:

[email protected]:~/code/projects/rules$ rake spec 
    /Users/dhaskew/.rvm/rubies/ruby-1.9.3-p194/bin/ruby -S rspec ./spec/c_spec.rb ./spec/main_spec.rb ./spec/routes_spec.rb 
    ..F*.....* 

    Pending: 
     My Site Domain Manager should know the password for each SUBDOMAIN in the list 
     # Not yet implemented 
     # ./spec/c_spec.rb:33 
     My Site GET '/rules/SUBDOMAINS' should test all subdomains 
     # Not yet implemented 
     # ./spec/routes_spec.rb:28 

    Failures: 

    1) My Site Domain Manager should know the username for each SUBDOMAIN in the list 
     Failure/Error: ENV['C_USERNAME_' + dom].nil?.should eq(false) 

      expected: false 
      got: true 

      (compared using ==) 
     # ./spec/c_spec.rb:29:in `block (4 levels) in <top (required)>' 
     # ./spec/c_spec.rb:28:in `each' 
     # ./spec/c_spec.rb:28:in `block (3 levels) in <top (required)>' 

    Finished in 0.05095 seconds 
    10 examples, 1 failure, 2 pending 

    Failed examples: 

    rspec ./spec/c_spec.rb:27 # My Site Domain Manager should know the username for each SUBDOMAIN in the list 
    rake aborted! 

問:我寫這篇文章的測試(S)更好,這樣我可以看到哪些環境變量沒有定義怎麼辦。

謝謝。

回答

0

一個簡單的方法是:動態生成it測試。一般來說,爭取每場景/ it區塊進行一次測試。在這種情況下:

@dm.domains.each do |dom| 
    it "should know the username for #{dom} in the list" do 
    ENV['C_USERNAME_' + dom].should_not be_nil 
    end 
end 

更新

下面是一個更完整的例子。您需要在before塊之外聲明@dm以使其可用。

class DomainManager 
    attr_reader :domains 

    def initialize(domains) 
    @domains = domains 
    end 
end 

describe DomainManager do 
    @dm = DomainManager.new(%w(example.com example.org)) 

    @dm.domains.each do |dom| 
    it "should know the username for #{dom} in the list" do 
     ENV['C_USERNAME_' + dom].should_not be_nil 
    end 
    end 
end 
+0

我嘗試過,並且無法使其正常工作。我收到的基本錯誤是「nil:NilClass(NoMethodError)」的未定義方法域,這表明@dm超出了範圍?我已經在'12'之前的頂部塊中定義了它'12(之前的所有)做 13 @dm = C :: DomainManager.new 14' – David

+0

爲什麼不能這樣工作@jmdeldin – David

+0

@David:變量定義在''之前'塊只在'it'塊中可用。然而,RSpec只是Ruby代碼,所以你可以在頂部定義你的實例變量。我用一個例子更新了我的答案。 – jmdeldin

相關問題