2012-10-31 61 views
2

我想寫一個RSpec測試什麼似乎是一個相對簡單的測試,但它證明相當棘手(雖然我是RSpec新來的)。RSpec測試,如果所有模型respond_to屬性

簡而言之,我想測試應用程序中的所有模型respond_to:owner或:owners。

我的第一個問題是循環所有的模型 - 如何在RSpec中做到這一點?我可以正常循環的模型,如:

ActiveRecord::Base.descendants.each { |model| 
    model.should respond_to :owner 
} 

但不知道如何在RSpec中正確執行此操作?我找不到有關在測試中使用循環的文檔。

我的第二個問題是關於「OR」條款 - 我如何實現「迴應所有者或所有者」?類似於:

model.should respond_to :owner || :owners 

但是我再次找到有關使用或子句的文檔。

謝謝!

回答

4

您可以通過測試每種方法和捲起的答案完成OR條件:

ActiveRecord::Base.descendants.each do |model| 
    instance = model.new 
    expected = instance.respond_to?(:owner) || instance.respond_to?(:owners) 
    expected.should be_true 
end 

但這種氣味我錯了。如果模型將僅響應:owner:owners中的一個,則應測試它是否響應正確的一個。即使這意味着要爲每個模型創建一個規範(無論如何都應該有這個規範)並添加一個新的示例,但從長遠來看,通過具體來說,您最好更好。它還可以幫助未來的代碼維護者,他們希望模型規範在模型本身的spec文件中,而不是全部規範。

在這種情況下,該示例非常小 - 對於較長的示例,您可能會考慮使用shared example來幹一些事情。

1

當你運行Rspec測試你仍然在使用Ruby。因此,只要您處於it區塊中,您的循環就可以工作。你唯一的問題是你有一個模型對象不是對象的實例,所以你需要創建一個。所以一種解決方案是:

it "every model should respond to owners" do 

    ActiveRecord::Base.descendants.each { |model| 
    model.new.should respond_to :owner 
    } 

end 

我不確定or子句。