题
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的版本。