2014-04-18 6 views
7

Ich habe viel gesucht und kann das nicht herausfinden, obwohl es einfach scheint. Hier ist ein vereinfachtes Beispiel, was ich tun möchte.Rspec 3.0 Wie man eine Methode vortäuscht, die den Parameter aber ohne Rückgabewert ersetzt?

Erstellen Sie eine einfache Methode, die etwas tut, aber nichts zurückgibt, wie zB:

class Test 
    def test_method(param) 
    puts param 
    end 
    test_method("hello") 
end 

Aber in meinem rspec Test ich einen anderen Parameter, wie zum Beispiel „Auf Wiedersehen“ zu übergeben müssen anstelle von „hallo . " Ich weiß, das mit Stubs zu tun hat und verspottet, und ich habe mit Blick auf die Dokumentation aber kann es nicht herausgefunden: https://relishapp.com/rspec/rspec-mocks/v/3-0/docs/method-stubs

Wenn ich tun:

@test = Test.new 
allow(@test).to_receive(:test_method).with("goodbye") 

es mir sagt, ein Stub Standardwert, aber ich kann nicht herausfinden, wie es richtig geht.

Fehlermeldung:

received :test_method with unexpected arguments 
    expected: ("hello") 
    got: ("goodbye") 
Please stub a default value first if message might be received with other args as well.  

Ich verwende rspec 3.0 und ruft so etwas wie

@test.stub(:test_method) 

ist nicht erlaubt.

+0

gefunden werden Ihre Fehlermeldung scheint die Rückseite Ihres Stubs zu sein. –

Antwort

1

Für Ihr Beispiel, da Sie das tatsächliche Ergebnis von test_method nicht testen müssen, nur dass puts aufgerufen wird, in es in param vorbei, ich würde nur Test durch die Erwartung, Aufbau und Betrieb des Verfahrens:

class Test 
    def test_method(param) 
    puts param 
    end 
end 

describe Test do 
    let(:test) { Test.new } 

    it 'says hello via expectation' do 
    expect(test).to receive(:puts).with('hello') 
    test.test_method('hello') 
    end 

    it 'says goodbye via expectation' do 
    expect(test).to receive(:puts).with('goodbye') 
    test.test_method('goodbye') 
    end 
end 

Was es scheint, Sie versuchen, eine test spy auf der Methode zu tun eingerichtet ist, aber dann denke ich, die Methode Stub eine Stufe zu hoch sind Einrichtens (auf test_method selbst anstelle des Anrufs puts innerhalb test_method). Wenn Sie den Stummel auf den Anruf zu puts setzen, sollten Sie Ihre Prüfungen bestehen:

describe Test do 
    let(:test) { Test.new } 

    it 'says hello using a test spy' do 
    allow(test).to receive(:puts).with('hello') 
    test.test_method('hello') 
    expect(test).to have_received(:puts).with('hello') 
    end 

    it 'says goodbye using a test spy' do 
    allow(test).to receive(:puts).with('goodbye') 
    test.test_method('goodbye') 
    expect(test).to have_received(:puts).with('goodbye') 
    end 
end 
+1

Danke - das ist hilfreich! Zum einen wusste ich nicht, dass du 'expect (test). To receive (: puts)' sagen könntest - ich dachte, du könntest nur die Straight-Methode ('test_method' hier) nennen, also ist es gut zu wissen. Am Ende war mein tatsächliches Problem komplexer und ich entschied, dass ich nur meinen Code ändern musste, um eine Methode zu definieren, die * einen * Wert zurückgegeben hat, was wahrscheinlich sowieso besser ist. Und dann ist es einfach 'allow (test) .to receive (: test_method) .and_return ('tschüss')' zu verwenden. Ich bin mir sicher, dass es einen anderen Weg gibt, etwas davon zu benutzen, und es ist auch gut, über Testspione Bescheid zu wissen - ich hatte das vorher nicht bemerkt. – user3060126

4

Wie einen Standardwert festlegen, die bei

and_call_original can configure a default response that can be overriden for specific args

require 'calculator' 

RSpec.describe "and_call_original" do 
    it "can be overriden for specific arguments using #with" do 
    allow(Calculator).to receive(:add).and_call_original 
    allow(Calculator).to receive(:add).with(2, 3).and_return(-5) 

    expect(Calculator.add(2, 2)).to eq(4) 
    expect(Calculator.add(2, 3)).to eq(-5) 
    end 
end 

Quelle erklärt, wo ich kam wissen über das kann bei https://makandracards.com/makandra/30543-rspec-only-stub-a-method-when-a-particular-argument-is-passed

Verwandte Themen