2013-06-25 50 views
4

should_receive`行爲請看下面的測試:RSpec的`有多個方法調用

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 Documentation說:

Use should_receive() to set an expectation that a receiver should receive a message before the example is completed.

所以我期待這個測試通過,但事實並非如此。它與以下消息失敗:

Failures: 

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

這是預期的行爲?有沒有辦法讓這個測試通過?

我使用紅寶石1.9.3p374rspec的2.13.1

+0

您正在關注哪些文檔?你會分享鏈接嗎?這是我要求我的自學...... :)) –

+0

問題中有一個鏈接。 :) – tdgs

回答

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 

該測試失敗,因爲您設置了一個精確的期望「一個應該接受:用'World'打印',但rspec注意到一個對象正在接收'Hello'的print方法,因此它未通過測試。在我的解決方案中,我允許使用任何參數調用print方法,但仍以「World」作爲參數跟蹤調用。

+0

在這個例子中,如果你省略'a.print(「World」)'行,它會失敗嗎? – Kostas

+0

@vrinek是的,它與'失敗/錯誤:a.should_receive(:print).with(「World」)。and_call_original#收到:打印與意外的參數' –

+0

我認爲'a.stub :打印).with(任何).and_call_original'會更好 – tdgs

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次)。乾杯!

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 
+1

問題是,這是一個單元測試,我不想污染它的調用與我希望測試的功能無關。 – tdgs

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')沒有通過測試。

相關問題