外部サービスをスタブアウトすることが可能かどうか疑問に思っています。アプリで次の外部サービスへの呼び出しがあります。
bitly = Bitly.new("someuser", "123key")
bitly.shorten("www.example.com/my_model/#{@my_model.id}")
受け入れテスト中に、このサービスを呼び出すたびに Bitly をスタブ化することはできますか?
任意の例をいただければ幸いです。
外部サービスをスタブアウトすることが可能かどうか疑問に思っています。アプリで次の外部サービスへの呼び出しがあります。
bitly = Bitly.new("someuser", "123key")
bitly.shorten("www.example.com/my_model/#{@my_model.id}")
受け入れテスト中に、このサービスを呼び出すたびに Bitly をスタブ化することはできますか?
任意の例をいただければ幸いです。
Webmock、https: //github.com/bblimke/webmockをチェックすることをお勧めします。私が気に入っている点の1つは、スタブ化されていないアウトバウンドhttpリクエストに対してエラーが発生することです(また、リクエストをスタブ化するために生成されたサンプルコードも提供します)。また、十分に文書化されています。
編集:あるいは、実際のhttpリクエストをスタブアウトする代わりに、shortメソッドをスタブアウトすることもできます。
bitly = Bitly.new("someuser", "123key")
bitly.stub(:shorten).and_return("some value")
bitly.shorten("<some url>").should == "some value"
クラスはいつでも再定義できshorten
、URL を受け入れる新しいメソッドを作成できます。また、コードにとって意味のある値を返す必要があります。
class Bitly
def initialize(p1, p2)
@p1, @p2 = p1, p2 # in case it's important to remember them
end
def shorten(url)
"some return value"
end
end
bitly = Bitly.new("someuser", "123key")
bitly.shorten("www.example.com/my_model/#{@my_model.id}")
その宣言の前に通常の Bitly ファイルを含めたとしても、その後のコードは再定義されたクラスとメソッドを使用します。
おそらく他にももっと良い方法がたくさんありますが、それは迅速で(そして汚い)、簡単に機能します。
場合によっては、すべての外部サービスの I/O のボトルネックとなっている特定のメソッドを特定し、それを置き換えて、コードが提供する他のすべてのものを利用できることがあります。それが Ruby の素晴らしいところの 1 つです。