2

テスト中のAPI呼び出しに対して、OpenURI-open-methodをスタブ化して、コンテンツを定数にパックしたファイルを返したいと思います。ただし、同じ解析メソッドで、OpenURIopenへの他のすべての呼び出しは通常どおり処理する必要があります

@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 に答える