パッチの代わりに 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
あなたの実際の実装が次のようなことをすると仮定しましょう:
- 入力パラメータでいくつかの作業を行います
- 外部 URL への呼び出しを行い、応答を取得します (これはモックしたい部分です)。
- 応答を処理し、呼び出し元に何かを返す可能性があります
この関数を単体テストする場合は、上記のポイント 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
お役に立てれば。