用于一个参数的Stubbing方法,为其他参数调用原始

时间:2012-11-27 17:27:48

标签: ruby-on-rails rspec mocking stub

在测试期间进行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中返回本地图像文件。

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

2 个答案:

答案 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"))