2

我有一个静态方法,它通过进行外部服务调用来启动一个静态变量。我想存根该静态方法调用,以便在初始化类变量时不进行外部服务调用。这是我的代码的简单示例。

class ABC
    def self.ini
        return someCallToMyExternalLibrary # i don't want the execution to go there while testing
    end

    @@config = self.ini

    def method1
        return @@config['download_URL']
    end
end

现在我想用我的对象存根静态方法调用,以便使用我想要获得的响应来初始化 @@config。我已经尝试了几件事,我似乎没有用我的对象初始化@@config,而是仅通过实现的调用来初始化。

describe ABC do
    let(:myObject) { Util.jsonFromFile("/data/app_config.json")}
    let(:ABC_instance) { ABC.new }

    before(:each) do
        ABC.stub(:ini).and_return(myObject)
    end

    it "check the download url" do
        ABC_instance.method1.should eql("download_url_test")
        # this test fails as @@config is not getting initialized with my object
        # it returns the download url as per the implementation.
    end

end

我什至尝试在 spec_helper 中存根,尽管它会在执行到达那里时初始化类变量之前首先执行,但这也没有帮助。我现在坚持了一段时间。请有人成为救世主。

4

2 回答 2

1

我建议您将类变量 @@config 设置为您想要的值,而不是存根 ":ini" 方法,因为解析器在您调用存根方法之前会通过 ABC 定义,所以我认为您不能这样做在你的前块:

before(:each) do
  ABC.class_variable_set(:@@config, myObject)
end

然后尝试看看这是否解决了您的问题。

于 2013-08-06T07:38:50.737 回答
1

@@config您的问题是在加载类时正在发生初始化,ABC并且您无法通过存根干预该过程。如果您不能对外部调用本身存根,那么我唯一能想到的就是更改类定义以包含单独的类初始化方法。

于 2013-08-07T20:08:35.407 回答