4

外部APIを呼び出すcreateメソッドをテストしようとしていますが、外部APIリクエストをモックするのに問題があります。これが私のセットアップとこれまでに試したことです。

class Update
  def self.create(properties)
    update = Update.new(properties)

    begin
      my_file = StoreClient::File.get(properties["id"])
      update.filename = my_file.filename
    rescue
      update.filename = ""
    end    

    update.save  
  end
end


context "Store request fails" do
  it "sets a blank filename" do
    store_double = double("StoreClient::File")
    store_double.should_receive(:get).with(an_instance_of(Hash)).and_throw(:sad)
    update = Update.create({ "id" => "222" })
    update.filename.should eq ""        
  end
end

現時点で私はこの失敗を取得しています

 Failure/Error: store_double.should_receive(:get).with(an_instance_of(Hash)).and_throw(:sad)
   (Double "StoreClient::File").get(#<RSpec::Mocks::ArgumentMatchers::InstanceOf:0x000001037a9208 @klass=Hash>)
       expected: 1 time
       received: 0 times

ダブルが機能しないのはなぜですか。また、の呼び出しをモックしてStoreClient::File.get、成功または失敗したときにcreateメソッドをテストできるようにするのに最適な方法は何ですか。

4

1 に答える 1

8

問題は、 「StoreClient :: File」と呼ばれるdouble("StoreClient::File")doubleを作成することであり、実際にはそれ自体が実際のオブジェクトの代わりにはなりません。StoreClient::File

あなたの場合、私はあなたが実際にダブルを必要としないと思います。次のように、オブジェクトのgetメソッドを直接スタブできます。StoreClient::File

context "Store request fails" do
  it "sets a blank filename" do
    StoreClient::File.should_receive(:get).with(an_instance_of(Hash)).and_throw(:sad)
    update = Update.create({ "id" => "222" })
    update.filename.should eq ""        
  end
end
于 2012-12-04T12:33:28.800 に答える