2017-04-12 5 views
0

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__

として
+0

'mymodule'は何ですか?私はあなたが正しいことを嘲笑したとは思わない。 – chepner

+0

@chepner mymoduleは、client.pyとtests.pyが存在するモジュールです。 pdbを使うときは、 'self .__ enter__'と' self .__ exit__'がMagicMockであることがわかります。これは正しい場所にパッチを当てることを意味します。 – Dunatotatos

答えて

0
PEP343 https://www.python.org/dev/peps/pep-0343/に見る

The exception is swallowed if exit() returns true 

Trueとして評価、MagicMockを返しself.__exit__Client.method_to_testMagicMockあります。 RuntimeErrorは飲み込まれます。

修正が簡単です。 self.__exit__()代わりMagicMockNoneを返すように:

# 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): 
     # __exit__ returns None, evaluated as False 
     mock_exit.return_value = None 
     mock_enter.return_value = None 
     client = Client() 
     with self.assertRaises(RuntimeError): 
      client.method_to_test() 
関連する問題