2013-06-25 17 views
12

Sto provando a eliminare l'API Stripe utilizzando Rspec e sto riscontrando un problema. Ecco ciò che il mio codice è simile:Errore Rspec mocks: numero errato di argomenti

Stripe::Customer.should_receive(:create).with(any_args).and_raise(Stripe::CardError) 

Ecco l'errore che sto ricevendo:

Failure/Error: Stripe::Customer.should_receive(:create).with(any_args).and_raise(Stripe::CardError) 
ArgumentError: 
    wrong number of arguments (0 for 3..6) 
+0

fa Stripe :: CardError richiede 3..6 argomenti per caso? –

+0

Penso che potrebbe, ma ero sotto l'impressione che Rspec avrebbe fatto un po 'di magia per creare un'istanza derisa dell'errore. Non è questo il caso? – LandonSchropp

+0

Non sono a conoscenza di questa capacità, ma non avrebbe comunque la possibilità, dato che Ruby sta valutando Strip :: CardError prima che RSpec abbia la possibilità di fare qualsiasi cosa. –

risposta

19

banda :: CardError richiede 3..6 argomenti, secondo il seguente codice sorgente:

class CardError < StripeError 
    ... 
    def initialize(message, param, code, http_status=nil, http_body=nil, json_body=nil) 

Ecco la documentazione chiave dal doc RSpec a github:

expect(double).to receive(:msg).and_raise(error) 
    #error can be an instantiated object or a class 
    #if it is a class, it must be instantiable with no args 

Dato che si fornisce solo la classe e la classe richiede argomenti, non funziona. È necessario istanziarlo (vale a dire tramite new) e fornire argomenti.

definizione completa è in https://github.com/stripe/stripe-ruby/blob/0c281891948a793e79cc997d31918ba7f987f7ae/lib/stripe/errors/card_error.rb

+0

Abbastanza semplice. Grazie per l'aiuto. – LandonSchropp

+5

Questa risposta mi ha aiutato a scoprire che non potevo scrivere qualcosa come 'expect (obj) .to receive (: msg) .and_raise (ActiveRecord :: RecordInvalid)'. Ho dovuto passare il record all'errore. 'expect (obj) .to receive (: msg) .and_raise (ActiveRecord :: RecordInvalid.new (obj))'. Lo stacktrace e il messaggio restituito da RSpec di "ArgumentError: errato numero di argomenti (0 per 1)" non rendevano evidente che era il messaggio di errore che non veniva inizializzato correttamente. Grazie per l'aiuto! –

+1

@KyleTolle grazie per quello. Ho battuto la testa su questo da pranzo. –

Problemi correlati