如何使用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配置应该有配置实例 失败/错误:允许(obj)。接收(:config).and_return(config) TestModule没有实现:config #。/ spec / config_spec.rb:41:在&#39;
中的块(2级)
答案 0 :(得分: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
答案 1 :(得分: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
,那么只需要attr_writer :config
即可,因为读者/获取者已经被定义为该方法。
此外,如果您已经使用class << self
打开了类,那么在其中声明.config
方法会更有意义,因为它将包含所有类级别定义。只需从声明的开头删除self.
,使其显示为def config
,因为您已经在课程“内部”。