【问题标题】: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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-03
        • 2018-07-09
        • 2021-07-10
        • 2019-11-20
        • 2016-07-06
        • 1970-01-01
        相关资源
        最近更新 更多