2017-08-22 24 views
0

状況:ヘルパーメソッドをスタブして、それをラップするメソッドを呼び出して、スタブされたレスポンスを返すことができます。スタブラッパーメソッド(RSpec Mocks)によって呼び出される 'ネストされた'クラスメソッド

コードは次のように設定されている:

class Thing 
    def self.method_one(foo) 
    self.method_two(foo, 'some random string') 
    end 

    def self.method_two(foo, bar) 
    self.method_three(foo, bar, 'no meaning') 
    end 

    def self.method_three(foo, bar, baz) 
    "#{foo} is #{bar} with #{baz}" 
    end 
end 

私は.method_oneを呼び出し、それが最終的には二重の代わりに本物の.method_three年代を呼び出す持つことができるように.method_threeを模擬しようとしている:

it "uses the mock for .method_three" do 
    response_double = 'This is a different string' 
    thing = class_double("Thing", :method_three => response_double).as_stubbed_const 

    response = thing.method_one('Hi') 
    expect(response).to eq(response_double) 
end 
私は取得しています

エラー:

RSpec::Mocks::MockExpectationError: #<ClassDouble(Thing) (anonymous)> received unexpected message :method_one with ("Hi") 

私がしようとしていることは可能ですか?私は明白なステップを欠いているように感じますが、私の最善の努力にもかかわらず、私はこれの例や何かを尋ねる質問を見つけることができませんでした。

(注:それが重要ならば、これはRailsのプロジェクトではありません。)

答えて

1

あなたは中間メソッドをスタブにしRSpecののallow(...)を使用することもできます。これは、ロジックフローのテストや、テストでのサードパーティサービスのモック作成にも役立ちます。例えば

:そして expected_response = 'This is a different string' allow(Thing).to receive(:method_three).and_return(expected_response)

expect(Thing.method_one('Hi')).to eq(expected_response)

を通過すべきです。

スタブ法の詳細については、https://relishapp.com/rspec/rspec-mocks/v/2-14/docs/method-stubsを参照してください。

+0

完璧!私はこれを使用して、サードパーティのAPIからの応答を模擬しています。私の '.method_three'が実際にファラデー接続を返してから別のメソッドを呼び出すので、私は' receive_message_chain'を使う必要がありました。 私の実際のコードはこれです(これは若者を将来的に助けるかもしれません): 'allow(FaradayConnection).to receive_message_chain(:connection、:get).and_return(expected_faraday_response)' – tjukes

関連する問題