2

現在、リファクタリングの真っ最中で、次のことに苦労しています。

私はこのようなクラスを持っています:

class Example
  def self.some_method
    if Rails.env.test?
      true
    else
      hit_external_service
    end
  end
 end

さて、本番コードとテストコードをクラスに混在させるのはあまり良くないと思います。私たちはモカを使用しているので、このメソッドは次のようにあちこちで呼び出されるため、条件付きロジックを削除して、テスト スイート全体のスタブを設定することを考えました。

class ActiveSupport::TestCase
  setup do
    Example.stub(:some_method).returns(true)
  end
end

しかし、元のメソッドをテストしたいときは、非常に汚いように見える「スタブを解除」する必要があるため、これを行う方法に固執しています。

また、外部サービスを別のクラスにヒットさせ、そのクラスを注入可能な依存関係として持つロジックを抽出することも考えたので、テストスイート全体で次のことができます。

Example.external_service = DummyImplementation

そして、私ができる実際のテストのために:

Example.external_service = RealImplementation

しかし、ロジックは実際には3行しかないので、これはやり過ぎのようです。

提案はありますか?おそらく私が見ていない単純なものはありますか?

4

1 に答える 1

1

クラスメソッドをスタブ化するために、私は通常、それを必要とする特定のテストケースでスタブを作成しますが、その後、ティアダウン時にメソッドのスタブを解除します。このような:

'test_helper'が必要です

class MyTest < ActiveSupport::TestCase

  def teardown
    Example.unstub(:some_method)
  end

  test "not hitting the service" do
    Example.stub(:some_method).returns(true)
    assert Example.some_method
  end

  test "hitting the service" do
    assert Example.some_method
  end

end
于 2012-07-25T18:22:19.063 に答える