1

Railsでのテストに取り掛かろうとしています。

私のモデルの1つにありますafter_validation :grab_external_stuffgrab_external_stuff外部APIを呼び出すメソッドです。テストではこれを実行したくありません。

after_validationテストでこのメソッドを無効にする正しい方法は何ですか?(rspecを使用して)どうすればよいですか?そして、私はそれをどこで行いますか?

スタブを使用して、呼び出されるメソッドを停止できることを知っています。しかし、after_validationまたは同様のフックにそれを適用する方法を見つけるのに苦労しています。

たとえば、プロジェクトに属し、ユーザーに属するタスクがあるとします。私はfactory(:task)を実行します。これは、関連するプロジェクトとユーザーも作成しています。ただし、ユーザーが検証されると、grab_external_stuffが呼び出されます。

では、テストのどこで、このメソッドを実行したくないことを指定する必要がありますか?テストでは、工場では、どこか他の場所で?

アドバイスありがとうございます。

4

2 に答える 2

3

本当にgrab_external_stuffメソッドですか?モジュールで定義されているか、モデルの 1 つのクラス メソッドとして定義されている可能性がありますか? その場合、実行したくないことが確実な場合は、次のようにスタブ化できます。

before(:suite) do
    Model.any_instance.stub(:grab_external_stuff) { nil } # if it's an instance method
    # or:
    # Model.stub(:grab_external_stuff) { nil } if it's a class method, etc
end

spec_helper、またはテストごとなどで設定できます。

このメソッドが after_validation ブロックによって呼び出されているという事実は関係ありません。これは単なるメソッドであり、他のメソッドと同様にスタブ化できるためです。

編集Factory で何かを作成しているためにこの検証が行われている場合でも、それはスタブ化されます。テストで Factory から作成しますが、は、、またはのbeforeいずれかになりますが、いずれにしても、 が検出される前に実行され、スタブが呼び出されます。したがって、Factory が呼び出される前に、常にスタブ化されることを意味します。 .before(:suite):all:eachit {}

于 2012-05-22T18:09:23.077 に答える
1

ここで:grab_external_stuff提案されているように、メソッドをスタブできます。もう 1 つの方法は、FakeWebを使用して API リクエストをスタブ化することです。これはおそらく統合テストに適しています-スタブは単体テストIMOに適しています。:grab_external_stuff

于 2012-05-22T20:49:21.813 に答える