【问题标题】:Stub class instance inside module that doesn't exist模块内不存在的存根类实例
【发布时间】:2020-04-05 15:36:37
【问题描述】:
对于一个规范,我试图在一个新模块 (NewModule) 中存根一个新类 (MyClass),这两个模块都不存在。
此规范适用于使用 MyClass 的类
let(:my_class) { instance_double('ParentModule::NewModule::MyClass', extract_values: expected_value) }
ParentModule:已经存在
NewModule:尚不存在
MyClass:尚不存在
不幸的是,它抛出了这个错误
NameError:
uninitialized constant ParentModule::NewModule
任何建议什么是实现这一目标的正确方法。
【问题讨论】:
标签:
ruby-on-rails
ruby
rspec
rspec-rails
rspec3
【解决方案1】:
您可以通过stub_const 存根常量:
let(:my_class) { stub_const('ParentModule::NewModule::MyClass', Class.new) }
来自文档:
当常量尚未定义时,所有
必要的中间模块将被动态创建。示例完成后,
中间模块常量将被删除以将常量状态返回到它的状态
开始了。
【解决方案2】:
感谢@Stefan 的上述建议,这对我有用。
# Modules Abc and Pqr also do not exist yet
let(:class_name) { 'Abc::Pqr::SomeMagic' }
let(:fake_class) { Class.new { def do_some_magic; end } }
let(:magic_class) { class_double(stub_const(class_name, fake_class)).as_stubbed_const }
let(:magic_class_instance) { instance_double(magic_class) }
before do
allow(magic_class).to(receive(:new).and_return(magic_class_instance))
allow(magic_class_instance).to(receive(:do_some_magic).and_return('some value'))
end