【问题标题】:Rspec mocks error: wrong number of argumentsRspec 模拟错误:参数数量错误
【发布时间】:2013-06-22 14:23:08
【问题描述】:

我正在尝试使用 Rspec 删除 Stripe API,但遇到了问题。这是我的代码的样子:

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)

【问题讨论】:

  • Stripe::CardError 是否需要 3..6 个参数?
  • 我认为它可能,但我的印象是 Rspec 会做一点魔法来创建错误的模拟实例。不是这样吗?
  • 我不知道这种能力,但无论如何它没有机会,因为 Ruby 将在 RSpec 有机会做任何事情之前评估 Strip::CardError。
  • 投反对票似乎有点苛刻。在测试用例中找到错误数量的链式调用中的参数错误,其中测试代码和运行代码的语言不需要括号进行方法调用,这可能会令人困惑。

标签: ruby rspec stripe-payments


【解决方案1】:

Stripe::CardError 需要 3..6 个参数,根据以下源代码:

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

这是来自 github 上 RSpec 文档的关键文档:

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

【讨论】:

  • 很简单。感谢您的帮助。
  • 这个答案帮助我发现我不能写像expect(obj).to receive(:msg).and_raise(ActiveRecord::RecordInvalid) 这样的东西。我不得不将记录传递给错误。 expect(obj).to receive(:msg).and_raise(ActiveRecord::RecordInvalid.new(obj))。从ArgumentError: wrong number of arguments (0 for 1) 的 RSpec 返回的堆栈跟踪和消息并没有表明错误消息没有正确初始化。感谢您的帮助!
  • @KyleTolle 谢谢你。自午餐以来,我一直在努力解决这个问题。
  • @KyleTolle 我遇到了完全相同的问题。我想知道 RSpec 是否应该更好地突出这些问题...
  • @JacoPretorius 是的,如果 RSpec 能告诉你问题,或者至少给出某种提示,那将非常有帮助。部分问题在于它取决于所使用的错误消息。并非所有错误都需要实例化时的对象。对我来说,这是一个不熟悉ActiveRecord::RecordInvalid 错误的问题,不足以知道它需要一个对象。知道哪个方法调用需要一个参数会更有帮助。否则你必须知道and_raise 的内部结构才能知道错误可能来自哪里。很难找到!
猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
相关资源
最近更新 更多