为什么你不能直接存根!模拟对象?

时间:2011-01-12 21:01:59

标签: mocking rspec

我可能会遗漏一些完全明显的东西,但为什么我必须这样做:

setup do
  @person = mock("person")
  @person.stub!(:name).and_return("david")
end

而不是

@person = mock("person").stub!(:name).and_return("david")

什么是mock(“string”)返回,不允许它被存根而不允许@person被存根?模拟不返回一个对象(可能只是修改了一些模拟出来的函数的内部哈希表,然后返回一个单独的对象?

2 个答案:

答案 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")