我正在使用rspec 3.0.3和ruby 2.1.2并且无法弄清楚出了什么问题。 很抱歉没有很好的代码实现(我的意思是类变量),但它是更容易显示出错的方法。
我有2节课。首先调用Test类的new_method应该调用应该更改@@ c_var类变量的AnotherTest.call_method。
require "rspec"
class Test
def self.new_method
AnotherTest.call_method
end
end
class AnotherTest
@@c_var = "hola"
def self.call_method
@@c_var = "holla from another test"
end
def self.c_var
@@c_var
end
end
我正在编写规范:
describe Test do
it "should call method from an other class" do
Test.new_method
expect(AnotherTest.c_var).to be_eql("holla from another test")
end
end
这个规格工作正常。但后来我试图用“期待接听电话”出错了
describe Test do
it "should call method from an other class" do
expect(AnotherTest).to receive(:call_method).and_return("holla from another test")
Test.new_method
expect(AnotherTest.c_var).to be_eql("holla from another test")
end
end
Failures:
1) Test should call method from an other class
Failure/Error: expect(AnotherTest.c_var).to be_eql("holla from another test")
expected `"hola".eql?("holla from another test")` to return true, got false
# ./test.rb:26:in `block (2 levels) in <top (required)>'
似乎RSpec正在对此进行检查,例如迁移并在其后进行回滚。
这是一个奇怪的示例,我知道,但我注意到这个错误只有一个类的一个实例的方法是从另一个实例调用方法,并且该方法试图改变一些东西。
答案 0 :(得分:2)
使用expect(...).to receive(...)
,不会调用原始方法。相反,当它被调用时,它只返回传递给and_return(...)
的任何内容而不实际执行你的方法。
您可能想要的是and_call_original
。这样,您可以确保调用该方法,并仍然允许它执行:
expect(AnotherTest).to receive(:call_method).and_call_original