我有这个简单的代码,我发送http请求并读取所有响应。 这是我的rails代码
open("http://stackoverflow.com/questions/ask")
如何为这行代码编写规范。我没有选择使用mocha和webmock。我只能使用Rpsec的模拟框架。
我试图使用此声明
OpenURI.stub!(:open_uri).should_receive(:open).with("http://stackoverflow.com/questions/ask")
但我一直收到此错误
RSpec::Mocks::MockExpectationError: (#<RSpec::Mocks::MessageExpectation:0xd1a7914>).open("http://stackoverflow.com/questions/ask")
expected: 1 time
received: 0 times
答案 0 :(得分:18)
我认为open
方法是在Kernel
的级别上定义的,但我错了。
如果你想嘲笑open
,你应该在对象的级别这样做:
it "should do something" do
object_under_test = ObjectUnderTest.new
object_under_test.should_receive(:open).with("http://example.org")
end
答案 1 :(得分:3)
我做了:
my_object.stub_chain(:open, :read) { "my return value" }
答案 2 :(得分:2)
根据此链接http://distillations.2rye.com/2011/08/mock-the-web-openuri/,open函数在Kernel模块上定义,但混合到您的控制器中。因此,您需要在该级别存根调用。此解决方案适用于RSpec控制器测试:
html_content = <<-EOS
<html><head>
<title>Some Title</title>
</head>
<body>Some Content</body></html>
EOS
YourController.any_instance.stub(:open).and_return html_content
答案 3 :(得分:0)
要存根open-uri
,您可以使用以下语法 RSpec 3 +
file = double('file')
expect(OpenURI).to receive(:open_uri).and_return(file)