0

我正在使用 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 正在像迁移一样进行此检查并在其后进行回滚。

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

4

1 回答 1

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

于 2014-07-31T12:48:53.200 回答