4

考虑以下测试:

class A
  def print(args)
    puts args
  end
end

describe A do
  let(:a) {A.new}

  it "receives print" do
   a.should_receive(:print).with("World").and_call_original

   a.print("Hello")
   a.print("World")
 end
end

RSpec文档说:

使用 should_receive() 设置接收者应该在示例完成之前收到消息的期望。

所以我期待这个测试能够通过,但事实并非如此。它失败并显示以下消息:

Failures:

1) A receives print
 Failure/Error: a.print("Hello")
   #<A:0x007feb46283190> received :print with unexpected arguments
     expected: ("World")
          got: ("Hello")

这是预期的行为吗?有没有办法让这个测试通过?

我正在使用ruby​​ 1.9.3p374rspec 2.13.1

4

4 回答 4

4

这应该有效:

class A
  def print(args)
    puts args
  end
end

describe A do
  let(:a) {A.new}

  it "receives print" do
   a.stub(:print).with(anything())
   a.should_receive(:print).with("World").and_call_original

   a.print("Hello")
   a.print("World")
 end
end

测试失败是因为您设置了一个精确的期望“a 应该接收 :print with 'World'”,但是 rspec 注意到 a 对象正在接收print带有 'Hello' 的方法,因此它没有通过测试。在我的解决方案中,我允许print使用任何参数调用该方法,但它仍然跟踪以“World”作为参数的调用。

于 2013-06-25T14:29:24.837 回答
2

这个怎么样?

class A
  def print(args)
    puts args
  end
end

describe A do
  let(:a) {A.new}

  it "receives print" do
   a.should_receive(:print).with("World").and_call_original
   # it's important that this is after the real expectation
   a.should_receive(:print).any_number_of_times

   a.print("Hello")
   a.print("World")
 end
end

它增加了您可能想要避免的第二个期望。但是,考虑到@vrinek 的问题,该解决方案的优点是提供了正确的失败消息(预期:1 次,收到:0 次)。干杯!

于 2013-06-28T01:17:13.053 回答
1

添加怎么样allow(a).to receive(:print)

require 'rspec'

class A
  def print(args)
    puts args
  end
end

describe A do
  let(:a) { described_class.new }

  it 'receives print' do
    allow(a).to receive(:print)
    expect(a).to receive(:print).with('World')

    a.print('Hello')
    a.print('World')
  end
end

基本上,allow(a).to_receive(:print)允许“a”接收带有任何参数的“打印”消息。因此a.print('Hello')不会通过测试。

于 2015-06-26T03:27:22.827 回答
0

should_receive不仅检查是否调用了预期的方法,而且检查了未调用的意外方法。只需为您期望的每个调用添加一个规范:

class A
  def print(args)
    puts args
  end
end

describe A do
  let(:a) {A.new}

  it "receives print" do
   a.should_receive(:print).with("World").and_call_original
   a.should_receive(:print).with("Hello").and_call_original

   a.print("Hello")
   a.print("World")
 end
end
于 2013-06-28T01:21:14.863 回答