使用 Rspec 处理 args 和 kwargs Ruby 3.0 和 3.1

Handling args and kwargs Ruby 3.0 and 3.1 with Rspec

提问人:Nedim Ramic 提问时间:9/19/2023 更新时间:9/19/2023 访问量:137

问:

我正在我们的项目中从 Ruby 3.0.6 升级到 Ruby 3.2.2,我遇到了一个奇怪的问题,我在过去几天里试图理解这个问题。 我们使用 RSpec 进行测试,在其中一个测试中,我们有以下代码:


    let(:request) { FactoryBot.build(:custom_request) }

    context "when not requesting their data" do
      let(:mail) { CustomtMailer.request_email(request: request) }

      it "renders the headers" do
        #expect something
      end
    end

CustomMailer 类如下所示:

class CustomMailer < ActionMailer::Base
  layout "application_mailer"

 
  def request_email(request:, csv: nil)
    #some data processing

    recipients = request.email
    sender = request.sender
    subject = "Some subject"

    mail(to: recipients, subject: subject, from: sender)
  end

好吧,我对现有代码的第一个问题是,虽然request_email是一个实例方法,但它在整个项目中被调用为类方法,并且以某种方式工作??? 第二个问题是 Ruby 2.7.8 和 Ruby 3.0.6 的测试。但是在 Ruby 3.1 测试失败后,我收到此错误:

ArgumentError: wrong number of arguments (given 1, expected 0; required keyword: request)

我的第一个想法是将该方法设为类方法,因为它不使用任何实例变量,但后来我遇到了邮件函数的问题NoMethodError: undefined method 'mail' for CustomMailer:Class

但最令人不安的是,对该方法的调用并没有失败,当我尝试调试并检查参数是如何传递的时,我看到所有参数都是作为位置参数传递的,并且是 args 对象的一部分,而不是 kwargs 对象。 任何想法为什么它以前工作,以及如何解决这个问题?request_email

Ruby-on-Rails rspec Ruby-3 Ruby-3.1

评论

2赞 max 9/19/2023
ActionMailer 做了一些非常时髦的元编程,将类方法调用委托给 mailer 类的实例。虽然这可能令人费解,但它完全符合文档。api.rubyonrails.org/classes/ActionMailer/Base.html
0赞 aridlehoover 9/22/2023
可能只是问题中的一个错别字,但测试引用和类实际上是.CustomtMailerCustomMailer
0赞 aridlehoover 9/22/2023
不知道它以前是如何工作的,现在不知道。但是,我想知道在方法中切换到位置参数是否会解决问题。request_email
0赞 Nedim Ramic 9/25/2023
错别字只在问题中,因为我不得不更改真实姓名,NDA bla bla bla。我的怀疑是由于 3.1 中的自动飞溅更改,但仍然没有得到它。更改为位置参数是有效的,但在这种情况下,我必须添加对 nils 的检查并更改应用程序其余部分的调用。我的第二个怀疑是这可能是一个 ActionMailer 问题,因为 rails 6.0 比 ruby 3.1 更旧,所以这些更改可以在以后的版本中修复,但它在 rails 6.1 中也不起作用,仍然试图找到一种方法来解决此问题,而无需使用位置参数或创建自定义包装器

答: 暂无答案