2

对于测试期间的 API 调用,我想存根 OpenURI-open-method 以返回一个文件,该文件的内容我打包在一个常量中。但是,在同一个解析方法中,所有其他对 OpenURI open 的调用都应该正常处理

@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

有谁知道如何实现这种“部分方法存根”(为一个特定参数存根方法,为其他参数调用原始方法)。其他文件是图像,所以我不想将它们作为常量存储在我的源代码中。在使测试独立于网络的扩展中,我还可以在else-case 中返回本地图像文件。

我会很高兴任何建议和提示:)

4

2 回答 2

1

非常类似于这个问题

这应该工作

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
于 2012-11-27T18:50:33.467 回答
0

您是否考虑过使用fakeweb宝石?我相信它修补了 OpenURI 的open方法包装的 Net::HTTP。

FakeWeb.register_uri(:get, "http://stackoverflow.com/questions", :body => File.open(TESTFILE, "r"))
于 2012-11-27T17:41:30.187 回答