在测试期间进行API调用,我想将OpenURI-open方法存根,以返回一个文件,该文件包含在一个常量中。但是,在相同的解析方法中,所有其他对OpenURI打开的调用都应该正常处理
@obj.should_receive(:open).with do |arg|
if arg == mypath # mypath is a string constant like "http://stackoverflow.com/questions"
obj=double("object_returned_by_openuri_open") # create a double
obj.stub(:read).and_return(TESTFILE) # with a stub
obj #return the double
else
open(arg) # call original Open URI method in all other cases
end
end
但是,在调用解析方法时,这不起作用,并在我的解析方法的行"NoMethodError:
undefined method read for nil:NilClass"
中返回f = open(mypath).read
。
有没有人知道如何实现这种“部分方法存根”(为一个特定参数存根方法,为其他人调用原始方法)。其他文件是Images,所以我不想在源代码中将它们存储为常量。在使测试与网络无关的扩展中,我还可以在else
- case中返回本地图像文件。
我会很高兴任何建议和提示:)
答案 0 :(得分:1)
与此question非常相似
这应该有效
original_method = @obj.method(:open)
@obj.should_receive(:open).with do |arg|
if arg == mypath # mypath is a string constant like "https://stackoverflow.com/questions"
obj=double("object_returned_by_openuri_open") # create a double
obj.stub(:read).and_return(TESTFILE) # with a stub
obj #return the double
else
original_method.call(arg) # call original Open URI method in all other cases
end
end
答案 1 :(得分:0)
您是否考虑过使用fakeweb
宝石?我相信它补丁Net :: HTTP,OpenURI的open
方法包装。
FakeWeb.register_uri(:get, "http://stackoverflow.com/questions", :body => File.open(TESTFILE, "r"))