2013-06-25 1 views
12

Я пытаюсь заглушить API-интерфейс Stripe, используя Rspec, и у меня возникает проблема. Вот что мой код выглядит следующим образом:Rspec mocks error: неправильное количество аргументов

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

ли Stripe :: CardError требует 3..6 аргументов случайно? –

+0

Я думаю, что это может быть, но я был под впечатлением, что Rspec сделал бы небольшую магию, чтобы создать посмеянный экземпляр ошибки. Разве это не так? – LandonSchropp

+0

Я не знаю об этой возможности, но у меня не было бы шанса, так как Ruby собирается оценить Strip :: CardError, прежде чем RSpec сможет что-либо сделать. –

ответ

19

Stripe :: CardError требует 3..6 аргументы, согласно следующему исходному коду:

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

Вот ключевая документация из дока RSpec на 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 

Поскольку вы просто предоставляете класс, а класс требует аргументов, он не работает. Вам необходимо создать экземпляр (например, через new) и предоставить аргументы.

Полное определение в https://github.com/stripe/stripe-ruby/blob/0c281891948a793e79cc997d31918ba7f987f7ae/lib/stripe/errors/card_error.rb

+0

Прост достаточно. Спасибо за помощь. – LandonSchropp

+5

Этот ответ помог мне обнаружить, что я не мог написать что-то вроде 'ожидать (obj). Получать (: msg) .and_raise (ActiveRecord :: RecordInvalid)'. Мне пришлось передать запись на ошибку. 'ожидать (obj) .to получать (: msg) .and_raise (ActiveRecord :: RecordInvalid.new (obj))'. Стек и сообщение, возвращенное из RSpec «ArgumentError: неправильное количество аргументов (0 для 1)», не показало очевидности, что сообщение об ошибке было неправильно инициализировано. Спасибо за помощь! –

+1

@KyleTolle благодарю вас за это. Я ждал этого во время завтрака. –