2010-02-14 17 views
5

所以我對ruby一般都比較陌生,我正在爲我創建的對象編寫一些rspec測試用例。很多測試用例都很基本,我只是想確保值正在填充並正確返回。我想知道是否有一種方法可以讓我使用循環構造來完成此操作。而不必爲每個我想測試的方法都設置一個assertEquals。如何從ruby中的字符串運行任意對象方法?

對於instace:

describe item, "Testing the Item" do 

    it "will have a null value to start" do 
    item = Item.new 
    # Here I could do the item.name.should be_nil 
    # then I could do item.category.should be_nil 
    end 

end 

但我想一些方法來使用數組來確定所有屬性的檢查。所以我可以做類似

propertyArray.each do |property| 
    item.#{property}.should be_nil 
end 

請問這種或類似工作的呢?感謝您的任何幫助/建議。

回答

6

object.send(:method_name)object.send("method_name")將工作。

所以你的情況

propertyArray.each do |property| 
    item.send(property).should be_nil 
end 

應該做你想要什麼。

+0

謝謝!我知道必須有辦法做到這一點。 – Boushley 2010-02-14 15:51:50

1

如果你

propertyArray.each do |property| 
    item.send(property).should be_nil 
end 

一個規範內。例如,如果那麼你的天賦失敗,將很難調試其屬性不是零或什麼失敗。一個更好的辦法來做到這一點是創建一個單獨的規範例如爲每個屬性像

describe item, "Testing the Item" do 

    before(:each) do 
    @item = Item.new 
    end 

    propertyArray.each do |property| 

    it "should have a null value for #{property} to start" do 
     @item.send(property).should be_nil 
    end 

    end 

end 

這將運行規範爲每個屬性不同的規格例如,如果失敗的話,你就會知道什麼是失敗。這也遵循每個測試/規範示例的一個斷言規則。

1

Object#send()幾個百分點......

您可以指定方法調用的參數也...

an_object.send(:a_method, 'A param', 'Another param') 

我喜歡用這個其他形式的__send__因爲「送」是如此普遍...

an_object.__send__(:a_method) 
相關問題