我可能会遗漏一些完全明显的东西,但为什么我必须这样做:
setup do
@person = mock("person")
@person.stub!(:name).and_return("david")
end
而不是
@person = mock("person").stub!(:name).and_return("david")
什么是mock(“string”)返回,不允许它被存根而不允许@person被存根?模拟不返回一个对象(可能只是修改了一些模拟出来的函数的内部哈希表,然后返回一个单独的对象?
答案 0 :(得分:3)
因为and_return
调用未返回存根对象。 mock
确实如此。
首先,为了使用模拟对象,您必须创建实际的模拟对象并将其分配给变量。当您调用mock("person").stub!...
时,模拟对象在调用链中丢失。您的链接版本仅在and_return
返回原始模拟对象时才有效。
答案 1 :(得分:3)
当Peter指出时,@ person被赋予and_return
而不是模拟对象的值。结果是Proc
。
你可以这样做:
@person = mock("person").tap {|obj| obj.stub!(:name).and_return("david") }
虽然所有这些都是不必要的,因为您可以在模拟定义中声明存根:
@person = mock("person", :name => "david")