ruby 如何在rspec中存根父类和子类

cyej8jka  于 2023-06-22  发布在  Ruby
关注(0)|答案(1)|浏览(130)

我在Rails(v7)应用程序中有一个类结构,看起来像这样:

# app/services/email_notifier.rb
class EmailNotifier
  def notify(template_data)
    # do things with email client
  end
end
# app/services/email_notifier/template_data.rb
class EmailNotifier
  class TemplateData
    def fill_in
      # do things with template and email client
    end
  end
end
# app/services/notification_service.rb
class NotificationService
  def call
    template_content = EmailNotifier::TemplateData.new(name: 'John Doe')
    EmailNotifier.notify(template_content)
  end
end

我想做的是验证类方法是否被调用:

# spec/services/notification_service.rb
require 'rails_helper'

RSpec.describe NotificationService do
  subject(:service) { described_class.new }
  let(:email_notifier) { class_double(EmailNotifier).as_stubbed_const }
  let(:email_template_class) { class_double(EmailNotifier::TemplateData).as_stubbed_const }
  let(:email_template) { instance_double(EmailNotifier::TemplateData) }

  before do
    allow(email_notifier).to receive(:notify)
    allow(email_template_class).to receive(:new).and_return(:email_template)
    allow(email_template).to receive(:fill_in)
  end

  it 'fills the template in' do
    service.call

    expect(email_template).to have_received(:fill_in)
  end
end

当我运行rspec时,我得到这个错误:

NameError:
       uninitialized constant #<ClassDouble(EmailNotifier) (anonymous)>::TemplateData

                 template_content = EmailNotifier::TemplateData.new

现在,我明白我可能面临着来自不同来源的问题:
1.运行规范时,类加载器没有正确解释我使用的结构
1.“父”类被存根化,它无法获取其“子”类
由于我怀疑正在发生的事情是2.,问题是我如何才能使这种存根发生?这可能吗?我是不是以错误的方式面对它?
我不确定stub_const是否像我期望的那样在这个规范中工作。

sbtkgmzw

sbtkgmzw1#

为什么在存根方法的时候还要模拟类呢?

allow(EmailNotifier).to receive(:notify)
    allow(EmailNotifier::TemplateData).to receive(:fill_in)

相关问题