假设我有一堂课:
class Product
def initialize(v)
@var = v
end
end
我想用 RSpec 测试类的实例化是否正常。应该在课堂或单元测试中进行测试,我该怎么做?
如果您的初始化程序如此简单,那么不值得对其进行测试。另一方面,如果您要在初始化程序中添加一些参数检查或其他逻辑,那么测试它可能是一个好主意。
大多数情况下,这种情况下的良好做法是在参数错误时引发 IllegalArgumentError。在这种情况下,您只需确保初始化对象确实(或没有)引发错误。
如果您正在做更复杂的事情,您可能需要检查实例变量的值。我不认为 usingattr_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
您需要向该类添加一个 attr_reader,以便通过 RSpec、Test::Unit、Minitest 或其他任何方式验证其状态。但是,您所说的基本上是测试 Ruby 作为一种语言是否正常工作,这确实不是您需要关心的事情。