0

如何使用 Rspec 3 模拟测试此模块中的配置方法?

module TestModule
  class << self
    attr_accessor :config
  end
  def self.config
    @config ||= Config.new
  end
  class Config
    attr_accessor :money_url
    def initialize
      @money_url = "https://example1.come"
    end
  end
end

我试过这样的事情:

describe "TestModule config" do
  it "should have config instance" do
    config = class_double("TestModule::Config")
    obj = instance_double("TestModule")
    allow(obj).to receive(:config).and_return(config)
    obj.config
    expect(obj.config).to eq(config)
  end
end

看起来,它不起作用,为什么?

失败:

1) TestModule 配置应该有配置实例失败/错误:allow(obj).to receive(:config).and_return(config) TestModule 没有实现:config # ./spec/config_spec.rb:41:in `block (2水平)在'

4

2 回答 2

1

我建议直接使用

describe "module config" do
  it "has config" do
    expect(TestModule.config).to be kind_of(TestModule::Config)
  end
end

如果您不需要.config由外部对象更改 ,则无需使用 ,attr_accessor :config因为def self.config已经定义了可访问的.config方法TestModule。如果您想允许.config从外部进行更改,那么只需 aattr_writer :config就足够了,因为 reader/getter 已被定义为该方法。

此外,如果您已经用 . 打开了类class << self,那么在其中声明.config方法会更有意义,因为它将包含所有类级别的定义。只需self.从声明的开头删除,这样它就可以读取def config为您已经“在”类中。

于 2014-12-11T16:10:22.490 回答
1

我相信您混淆了 class_double 和 instance_double。尝试切换它们,看看效果如何。(手机发的,请见谅)

更新:现在我在电脑前,我可以深入研究一下。首先,你为什么要存根你正在测试的方法?您不是在尝试测试它是否返回Config该类的实例吗?通过存根.config方法,您并没有真正测试您的方法以证明它可以执行您希望它执行的操作。我认为您真的可以将其简化为:

RSpec.describe TestModule do
  describe ".config" do
    it "returns an Config instance" do
      expect(TestModule.config).to be_a TestModule::Config
    end
  end
end
于 2014-12-11T14:37:50.797 回答