如何使用rspec从gem中存取模块方法

时间:2013-10-22 23:40:08

标签: ruby-on-rails ruby rspec module stub

我正在使用Curl gem for Ruby(https://github.com/taf2/curb),我需要在我的一个rspec测试中存根Curl.get(返回空白响应)。

这是我试过的:

o = OpenStruct.new(:body => '')
Curl.any_instance.stub(:get).and_return(o)

不幸的是,Curl是一个模块,而不是一个类(https://github.com/taf2/curb/blob/master/lib/curl.rb),所以当我尝试存根时它会出错:

stock_spec.rb:20:in `block (2 levels) in <top (required)>': undefined method `any_instance' for Curl:Module (NoMethodError)

我应该如何使用rspec在模块内存根方法?

2 个答案:

答案 0 :(得分:1)

来自curb docs:

Curb提供两个类:

Curl :: Easy - 简单的API,适用于日常任务。 Curl :: Multi - 更高级的API,用于同时操作多个URL。

这意味着类似

Curl::Easy.any_instance.stub(:get).and_return(o)

应该有用。

实际上你甚至可以使用stub模块方法:

o = OpenStruct.new(:body => 'test')
Curl.stub(:get).and_return(o)

然后在你的测试中:

http = Curl.get("http://www.google.com/")

答案 1 :(得分:1)

如果您需要存根Curl.get,请执行以下操作:

o = OpenStruct.new(:body => '')
Curl.stub(:get).and_return(o)

在Ruby中,模块和类的方法仍然只是方法。