【问题标题】:Why can't you directly stub! mock objects?为什么不能直接stub!模拟对象?
【发布时间】:2011-01-12 21:01:58
【问题描述】:

我可能在这里遗漏了一些非常明显的东西,但为什么我必须这样做:

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

而不是

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

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

【问题讨论】:

    标签: mocking rspec


    【解决方案1】:

    因为and_return 调用不返回存根对象。 mock 会。

    首先,为了使用模拟对象,您必须创建实际的模拟对象并将其分配给变量。当您调用mock("person").stub!... 时,模拟对象会在调用链中丢失。只有在 and_return 返回原始模拟对象时,您的链接版本才有效。

    【讨论】:

    • 谢谢 - 对 ARel 和 JQuery 的过度暴露感到困惑 :)
    • @David - 我看到了问题 :) 很高兴能提供帮助。
    【解决方案2】:

    正如Peter 指出的那样,@person 被分配了来自and_return 的值,而不是模拟对象。原来是Proc

    你可以这样做:

    @person = mock("person").tap {|obj| obj.stub!(:name).and_return("david") }
    

    虽然所有这些都是不必要的,因为您可以在模拟定义中声明存根:

    @person = mock("person", :name => "david")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多