我在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
是否像我期望的那样在这个规范中工作。
1条答案
按热度按时间sbtkgmzw1#
为什么在存根方法的时候还要模拟类呢?