with
文を含むPythonメソッドをテストしようとしています。 with
ステートメント内のコードは、RuntimeError
を呼び出すことができます。テストは、RuntimeError
が呼び出された場合のテストについて話しています。TestCase - mocking __enter__の際にwith文で例外が発生しない
__enter__
と__exit__
の方法は重いです(通常は開いているSSH接続と近いSSH接続)。テスト時にはそれらを偽ります。ここで
# client.py
class Client():
def method_to_test():
with self:
raise RuntimeError()
、私は__enter__
と__exit__
の定義を省略し、に関与していなかったmethod_to_test
のすべてのコードを削除しました現在の問題。このメソッドをテストする
、私は__enter__
と__exit__
をあざけり、そしてRuntimeError
が発生したかどうかを確認:
# tests.py
from django.test import TestCase
import mock
from .client import Client
class ClientTestCase(TestCase):
@mock.patch('mymodule.client.Client.__enter__')
@mock.patch('mymodule.client.Client.__exit__')
def test_method_raises_Runtime(self, mock_exit, mock_enter):
mock_enter.return_value = None
client = Client()
with self.assertRaises(RuntimeError):
client.method_to_test()
このテストはで失敗します。私は__enter__
を模擬していない場合はAssertionError: RuntimeError not raised
、RuntimeError
が発生します。 __enter__
を嘲笑すると、このテストは失敗します。 self.__exit__
'mymodule'は何ですか?私はあなたが正しいことを嘲笑したとは思わない。 – chepner
@chepner mymoduleは、client.pyとtests.pyが存在するモジュールです。 pdbを使うときは、 'self .__ enter__'と' self .__ exit__'がMagicMockであることがわかります。これは正しい場所にパッチを当てることを意味します。 – Dunatotatos