class A
  def initialize
    @x = do_something
  end

  def do_something
    42
  end
end

我怎么存根 do_something 在最高反射率,之前的原来的执行被称为(因而分配42 @x)?并没有改变实施的,当然。

有帮助吗?

解决方案

这里的承诺,这增加了功能以最高反射率 -这个是上月25 2008年。这个你可以做的

A.any_instance.stub(do_something: 23)

然而,最新的宝石版的最高反射率(1.1.11,October2008)没有这种程序。

这张票 各国,它们拉出来用于维护的原因,以及一个可供选择的解决方案尚未提供。

看起来并不像你可以做到这一点。你必须破解这类手动使用alias_method或somesuch.

其他提示

我找到这个溶液在 http://pivotallabs.com/introducing-rr/

new_method = A.method(:new)

A.stub!(:new).and_return do |*args|
  a = new_method.call(*args)
  a.should_receive(:do_something).and_return(23)
  a
end

我不知道该怎么做,在规范的框架模拟,但你可以很容易地将其交换出去摩卡做到以下几点:

# should probably be in spec/spec_helper.rb
Spec::Runner.configure do |config|
  config.mock_with :mocha
end

describe A, " when initialized" do
  it "should set x to 42" do
    A.new.x.should == 42
  end
end

describe A, " when do_something is mocked" do
  it "should set x to 23" do
    A.any_instance.expects(:do_something).returns(23)
    A.new.x.should == 23
  end
end

或与 RR

stub.any_instance_of(A).do_something { 23 }

在最新版本的RSpec为今天的 - 3.5,您可以:

allow_any_instance_of(Widget).to receive(:name).and_return("Wibble")

我不喜欢丹尼斯Barushev答案。我想建议只有一个表面上的变化,这使得new_method变量不必要的。 Rspec的确实上存根方法Munge时间,以便它们可以与proxied_by_rspec__前缀来访问:


A.stub!(:new).and_return do |*args|
  a = A.proxied_by_rspec__new(*args)
  a.should_receive(:do_something).and_return(23)
  a
end

在最高反射率的2.6或以后你可以用

A.any_instance.stub(do_something: 23)

看看 文档 更多的细节。(谢谢 rogerdpack 指出,现在,这是可能的-我认为它应得到一个答案其自己的)

要存根实例方法,你可以做这样的事情:

before :each do
  @my_stub = stub("A")
  @my_stub.should_receive(:do_something).with(no_args()).and_return(42)
  @my_stub.should_receive(:do_something_else).with(any_args()).and_return(true)
  A.stub(:new).and_return(my_stub)
end

但作为pschneider指出,只是在新与返回42: A.stub(:new).and_return(42)或东西的效果。

下面是一个想法,这可能不是很优雅,但基本上是肯定的工作:

创建一个很小的类继承你要测试的类,重写初始化方法,并调用后super 已经创造了初始化存根,像这样:

it "should call during_init in initialize" do
  class TestClass < TheClassToTest
    def initialize
      should_receive(:during_init)
      super
    end
  end
  TestClass.new
end

和你去那里!我只是在我的测试中一个使用这种成功。

rspec_candy 宝石自带,在这两种RSpec的1和RSpec 2 <工作的stub_any_instance辅助方法/ p>

在我的版本rspec的(1.2.2)的我可以做到这一点:

A.should_receive(:new).and_return(42)

我知道这可能是来不及回答原来的海报,但我的回答也无妨以供将来参考,因为我来到这里同样的问题,但弄清楚它是工作的最新RSpec的版本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top