RSpec 3和按摩期望

时间:2014-07-31 12:41:50

标签: ruby-on-rails rspec rspec3

我正在使用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正在对此进行检查,例如迁移并在其后进行回滚。

这是一个奇怪的示例,我知道,但我注意到这个错误只有一个类的一个实例的方法是从另一个实例调用方法,并且该方法试图改变一些东西。

1 个答案:

答案 0 :(得分:2)

使用expect(...).to receive(...),不会调用原始方法。相反,当它被调用时,它只返回传递给and_return(...)的任何内容而不实际执行你的方法。

您可能想要的是and_call_original。这样,您可以确保调用该方法,并仍然允许它执行:

expect(AnotherTest).to receive(:call_method).and_call_original

来源:https://www.relishapp.com/rspec/rspec-mocks/v/3-0/docs/configuring-responses/calling-the-original-implementation