2016-07-19 11 views
0

Ich stecke in Controller-Tests, mit einer Methode zu testen, die in einem Modul definiert ist. Hierrspec stub gibt nil zurück, wenn mit Argumenten übergeben

ist das Modul

module CommonConcern 
extend ActiveSupport::Concern 
... 
def fetch_suggested_portfolio(user_portfolio, amount) 
PortfolioService::Suggestion 
    .call(duration: user_portfolio.duration, 
     risk_level: user_portfolio.risk_level, 
     amount: amount, 
     investment_plan: user_portfolio.investment_plan, 
     portfolio_type: user_portfolio.portfolio_type) 
end 

Hier ist die Steuerung mit Aktion, wo die Methode

@portfolio_suggestion_object = fetch_suggested_portfolio(arg1, arg2) 

Jetzt wird aufgerufen, wenn Ich überprüfe meine Stub Linie mit binding.pry es gibt null

zurück
wealthy.stub(:fetch_suggested_portfolio).with(@portfolios, @portfolios.amount).and_return("suggested_portfolios") 

Auch nächste Zeile dh

wealthy.fetch_suggested_portfolio.should be("suggested_portfolios") 

gibt Fehler wie folgt:

Failure/Error: wealthy.fetch_suggested_portfolio.should be("suggested_portfolios") 

ArgumentError: 
    Wrong number of arguments. Expected 2, got 0. 

Auch 'rspec-Schienen' Ich bin mit '3.4.2'

Was ist falsch mit meinem Code, jede Hilfe wird wirklich geschätzt.

+0

Wenn Sie 'wohlhabendes.fetch_suggested_portfolio' aufrufen, übergeben Sie keine Argumente. Der Stub funktioniert nur, wenn Sie die 'with' Erwartung erfüllen. Sie definieren die Methode UND den Stub, um 2 Argumente – jaydel

Antwort

0

Sie haben die Methode fetch_suggested_portfolio definiert, um 2 Argumente zu erwarten. Ihr Stub sagt nur, dass es einen Stub dieses Namens gibt, der 2 Argumente benötigt und immer die Zeichenfolge "suggest_portfolios" zurückgibt. Es liefert diese Argumente nicht wirklich für Ihren Anruf.

Änderung:

wealthy.fetch_suggested_portfolio.should be("suggested_portfolios") 

sein:

wealthy.fetch_suggested_portfolio(something, something_else).should be("suggested_portfolios") 

Bedenken Sie auch die neuere Syntax der Verwendung erlaubt & erwartet. Natürlich müssen Sie das nicht, aber Sie könnten es in Betracht ziehen, da es besser liest, was Sie tatsächlich tun, wenn Sie Erwartungen setzen und Mocks erstellen & Stubs.

+0

zu erwarten, aber meine 'and_return (" suggest_portfolio ") - Anweisung zeigt Nullwert. Warum? –

+0

meinst du, es kommt zurück, wenn du die stubbed-methode aufruft? oder wenn Sie '' and_return (...) 'nennen? Wenn es ersteres ist, weiß ich nicht von ganzem Herzen. Wenn es das letztere ist, ist es, weil die letzte Zeile in der 'and_return'-Methode eigentlich nur' nil' ist. Sie finden die Quelle auf dieser Seite: http://www.rubydoc.info/github/rspec/rspec-mocks/RSpec%2FMocks%2FMessageExpectation%3Aand_return (beachten Sie, dass Sie die Methodendokumentation finden und auf 'Quelle anzeigen' klicken müssen. – jaydel

+0

um klarer zu sein, wenn Sie sagten "Jetzt, wenn ich meine Stubzeile mit binding.pry überprüfe, gibt es keine Antwort" ist die Antwort darauf, ja, das ist das erwartete Verhalten. – jaydel

Verwandte Themen