如何用rspec测试这样的代码?
Foo.create! do |foo|
foo.description = "thing"
end
我不想测试创建的对象 - 我想测试是否使用正确的对象调用了正确的方法。相当于测试这个:
Foo.create!(description: "thing")
用这个:
Foo.should_receive(:create!).with(description: "thing")
答案 0 :(得分:1)
这就是你要追求的吗?
it "sets the description" do
f = double
Foo.should_receive(:create!).and_yield(f)
f.should_receive(:description=).with("thing")
Something.method_to_test
end
答案 1 :(得分:0)
Foo.count.should == 1
Foo.first.description.should == 'thing'
答案 2 :(得分:0)
这是一种融合@ antiqe和@Fitzsimmons答案的最佳组合方法。但它更加冗长。
这个想法是以一种更像AR :: Base.create的方式模拟Foo.create。首先,我们定义一个辅助类:
class Creator
def initialize(stub)
@stub = stub
end
def create(attributes={}, &blk)
attributes.each do |attr, value|
@stub.public_send("#{attr}=", value)
end
blk.call @stub if blk
@stub
end
end
然后我们可以在我们的规范中使用它:
it "sets the description" do
f = stub_model(Foo)
stub_const("Foo", Creator.new(f))
Something.method_to_test
f.description.should == "thing"
end
您也可以使用FactoryGirl.build_stubbed
代替stub_model
。但是,您不能使用mock_model
,mock
或double
,因为您会再遇到同样的问题。
现在您的规范将通过以下任何代码段:
Foo.create(description: "thing")
Foo.create do |foo|
foo.descrption = "thing"
end
foo = Foo.create
foo.descrption = "thing"
感谢您的反馈!