模块内不存在的存根类实例

时间:2019-12-12 09:22:43

标签: ruby-on-rails ruby rspec rspec-rails rspec3

对于一个规范,我试图在一个新模块(NewModule)中存根一个新类(MyClass),这两个模块都不存在。

此规范适用于使用MyClass的类

let(:my_class) { instance_double('ParentModule::NewModule::MyClass', extract_values: expected_value) }

ParentModule:已经存在

NewModule:还不存在

MyClass:还不存在

不幸的是,它引发了此错误

NameError:
       uninitialized constant ParentModule::NewModule

任何建议都是实现此目标的正确方法。

2 个答案:

答案 0 :(得分:1)

您可以通过stub_const将常量存根:

let(:my_class) { stub_const('ParentModule::NewModule::MyClass', Class.new) }

从文档中

  

当尚未定义常量时,所有   必要的中介模块将被动态创建。该示例完成后,   中间模块常量将被删除,以将常量状态返回到其状态   开始。

答案 1 :(得分:0)

感谢@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