說我有一個類:如何檢查類實例化的正確
class Product
def initialize(v)
@var = v
end
end
,我想使用RSpec測試類的實例是否就沒有問題。是否應該在課堂或單元測試中進行測試,我該怎麼做?
說我有一個類:如何檢查類實例化的正確
class Product
def initialize(v)
@var = v
end
end
,我想使用RSpec測試類的實例是否就沒有問題。是否應該在課堂或單元測試中進行測試,我該怎麼做?
您需要添加一個attr_reader到類,以便通過RSpec,Test :: Unit,Minitest或其他來驗證它的狀態。然而,你所說的基本上是測試Ruby作爲一種語言正在工作,這實際上不是你需要關心的。
如果您的初始化程序非常簡單,那麼測試它就不值得。另一方面,如果您在初始化程序中添加了一些參數檢查或其他邏輯,那麼測試它可能是一個好主意。
大多數情況下,這種情況下的最佳做法是在參數錯誤時引發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