2013-06-25 35 views
12

Rspecを使用してStripe APIをスタブしようとしていますが、問題が発生しています。ここに私のコードは次のようになります。Rspec mockエラー:引数の数が正しくありません

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

はここで私が取得していますエラーです:

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

んストライプ:: CardErrorにありますか? –

+0

私はそうかもしれないと思っていますが、私は印象に残っていましたが、Rspecは少しの魔法を使ってエラーの模擬インスタンスを作成します。そうじゃないの? – LandonSchropp

+0

RSpecが何かをする機会がある前に、RubyがStrip :: CardErrorを評価するので、私はその能力を認識していませんが、とにかくチャンスはありません。 –

答えて

19

ストライプ:: CardErrorは、次のソースコードごとに、3..6の引数を必要とします。

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

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 

はここgithubのでRSpecのドキュメントからキーのドキュメントです

クラスを提供しているだけなので、クラスには引数が必要なので、失敗しています。インスタンス化(つまりnew経由)して引数を指定する必要があります。

完全な定義は、万が一3..6引数が必要https://github.com/stripe/stripe-ruby/blob/0c281891948a793e79cc997d31918ba7f987f7ae/lib/stripe/errors/card_error.rb

+0

十分に単純です。助けてくれてありがとう。 – LandonSchropp

+5

この回答は、 'expect(obj).to receive(:msg).and_raise(ActiveRecord :: RecordInvalid)'のようなものを書くことができなかったことを発見するのに役立ちました。私はエラーにレコードを渡さなければなりませんでした。 'expect(obj).to receive(:msg).and_raise(ActiveRecord :: RecordInvalid.new(obj))'です。 'ArgumentError:引数が間違っている(0の場合1)'というRSpecから返されたスタックトレースとメッセージは、エラーメッセージが正しく初期化されていないことを明らかにしていませんでした。助けてくれてありがとう! –

+1

@KyleTolleそれに感謝します。私は昼食以来これに頭を抱えていました。 –