1

モックを使用して書いたRestクライアントの単体テストを書こうとしています

このクラスがFoo2 つのメソッドを持っているとしましょう..get_foo()get_bar()

これが私のテストクラスです

fake_foo_response= 'foo'
class FooTestCase(unittest.TestCase):
  def setUp(self):
    self.patcher = patch('foo', fake_foo_response)
    self.patcher.start()
    self.foo = Foo()

  def tearDown(self):
    self.patcher.stop()

  def test_get_foo(self):
    response = self.foo.get_foo()
    self.assertEqual(response,'foo')

私は基本的にこのチュートリアルを使用してここに到達しました: http://seminar.io/2013/09/27/testing-your-rest-client-in-python/

しかし今、バーもテストしたい..このアプローチでバーをテストするにはどうすればよいですか? ありがとう

4

1 に答える 1

0

パッチの代わりに MagicMocks を使用すると、これを行うのが簡単になる場合があります。次の行に沿った何かが役立つはずです。

from mock import MagicMock

fake_foo_response = 'foo'
fake_bar_response = 'bar'

class FooTestCase(unittest.TestCase):

    def setUp(self):
        self.foo = Foo()
        self.foo.get_foo = MagicMock(return_value=fake_foo_response)
        self.foo.get_bar = MagicMock(return_value=fake_bar_response)

    def test_get_foo(self):
        response = self.foo.get_foo()
        self.assertEqual(fake_foo_response, response)

    def test_get_bar(self):
        response = self.foo.get_bar()
        self.assertEqual(fake_bar_response, response)

ただし、例で実際にテストしているものを確認する必要があると思います。ここで実際に行っていることは次のとおりです。

  • オブジェクトのインスタンスを作成しFooます。
  • 関数にパッチを適用して特定の値を返す。
  • パッチが適用された関数 (つまり、実際の関数ではない) を呼び出し、戻り値をアサートします。

実際にはget_foo関数をまったくテストしていないため、上記の状態でこのテストを行う価値はありません。ただし、ここで示している手法は、REST クライアント (テスト対象のユニットの外部で外部サービスを呼び出す必要がある) などをテストする場合に非常に役立ちます。get_fooあなたの実際の実装が次のようなことをすると仮定しましょう:

  1. 入力パラメータでいくつかの作業を行います
  2. 外部 URL への呼び出しを行い、応答を取得します (これはモックしたい部分です)。
  3. 応答を処理し、呼び出し元に何かを返す可能性があります

この関数を単体テストする場合は、上記のポイント 1 と 3 の動作をテストしてテストするテストを作成する必要がありますが、get_fooポイント 2 にパッチを適用します。get_fooユニットの外で呼び出しをモックアウトします。次に例を示します。

class Foo:

    def get_foo(self, input):
        url_param = <do something with input>
        response = self._call_url(url_param)
        output = <do something with response>
        return output


class FooTestCase(unittest.TestCase):

    def setUp(self):
        self.foo = Foo()
        self.foo._call_url = MagicMock(return_value='some response')

    def test_get_foo(self):
        output = self.foo.get_foo('bar')
        self.assertEqual('ni', output)

これで、ユニットの外部で何かを呼び出すことに依存することなく、(メソッドMagicMock内のコードをテストするために を介して) パッチを適用できるようになりました。get_foo

お役に立てれば。

于 2014-07-09T09:01:38.327 に答える