2013-02-13 70 views
1

說我有一個類:如何檢查類實例化的正確

class Product 
    def initialize(v) 
    @var = v 
    end 
end 

,我想使用RSpec測試類的實例是否就沒有問題。是否應該在課堂或單元測試中進行測試,我該怎麼做?

回答

0

您需要添加一個attr_reader到類,以便通過RSpec,Test :: Unit,Minitest或其他來驗證它的狀態。然而,你所說的基本上是測試Ruby作爲一種語言正在工作,這實際上不是你需要關心的。

1

如果您的初始化程序非常簡單,那麼測試它就不值得。另一方面,如果您在初始化程序中添加了一些參數檢查或其他邏輯,那麼測試它可能是一個好主意。

大多數情況下,這種情況下的最佳做法是在參數錯誤時引發IllegalArgumentError。在這種情況下,您可以確保初始化對象確實(或沒有)引發錯誤。

如果你做的更復雜的東西,你可能想檢查實例變量的值。我不認爲使用attr_reader是一個好主意,因爲我認爲爲了測試目的而改變類實現是一個壞主意。相反,我會使用#instance_variable_get來讀取變量。

class Foo 
    def initialize(mandatory_param, optional_param = nil) 
    raise IllegalArgumentError.new("param cannot be #{param}") if mandatory_param == 42 
    @var1 = mandatory_param 
    @var2 = optional_param unless param.is_a? String 
    end 
end 

describe Foo do 
    it "should not accept 42 as an argument" do 
    expect { Foo.new(42, 'hello') }.to raise_error(IllegalArgumentError) 
    end 

    it "should set var2 properly if it's not a String" do 
    f = Foo.new('hello', 1) 
    f.instance_variable_get(:@var2).should eq 1 
    end 

    it "should not set var2 if it's a String" do 
    f = Foo.new('hello', 'world') 
    f.instance_variable_get(:@var2).should be_nil 
    end 
end