2013-06-25 9 views
12

Próbuję wyodrębnić Stripe API za pomocą Rspec i mam problem. Oto co mój kod wygląda następująco:Rpec wyśmiewa błąd: niepoprawna liczba argumentów

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

oto błąd Dostaję:

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

Does Stripe :: CardError wymagają 3..6 argumenty przypadkiem? –

+0

Myślę, że mógł, ale byłem pod wrażeniem, że Rspec zrobiłby małą magię, by stworzyć wyszydzaną instancję błędu. Czy tak nie jest? – LandonSchropp

+0

Nie jestem tego świadomy, ale i tak nie miałbym szansy, ponieważ Ruby zamierza ocenić Strip :: CardError zanim RSpec ma szansę zrobić cokolwiek. –

Odpowiedz

19

Stripe :: CardError wymaga 3..6 argumenty, za pomocą następującego kodu źródłowego:

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

Oto klucz dokumentacja z doc RSpec na 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 

Ponieważ dostarczasz tylko klasę, a klasa wymaga argumentów, to się nie udaje. Należy utworzyć instancję (tj. Poprzez new) i podać argumenty.

Pełna definicja znajduje się w https://github.com/stripe/stripe-ruby/blob/0c281891948a793e79cc997d31918ba7f987f7ae/lib/stripe/errors/card_error.rb

+0

Wystarczająco proste. Dzięki za pomoc. – LandonSchropp

+5

Ta odpowiedź pomogła mi odkryć, że nie mogę napisać czegoś takiego jak 'expect (obj) .to receive (: msg) .and_raise (ActiveRecord :: RecordInvalid)'. Musiałem przekazać rekord do błędu. 'expect (obj) .to otrzymać (: msg) .and_raise (ActiveRecord :: RecordInvalid.new (obj))'. Stacktrace i komunikat zwracany przez RSpec z 'ArgumentError: niepoprawna liczba argumentów (0 za 1)' nie sprawiły, że komunikat o błędzie nie został poprawnie zainicjowany. Dzięki za pomoc! –

+1

@ KyleTolle dziękuję za to. Waliłem w to od lunchu. –