推測するのは難しいです実際のコードを見ることなく、しかし、私はいくつかの仮定を行いますが:
- 静的メソッド内のロジックは決定論的です。
- 入力値に対して何らかの計算を行った結果、結果は であり、この結果で何らかの操作が行われます。コードのいずれかをテストするために
- python3.4は、(モックは進化と最後のいくつかのバージョンの上に移動した)
少なくとも最後に、それは期待される結果を生成することを確認しなければなりません。戻り値がない場合、結果は通常格納されるか、どこかに送信されます。この場合、結果を格納または送信するメソッドが期待される引数で呼び出されることを確認できます。
これは、unittest
パッケージの一部となっているmock
パッケージで利用可能なツールを使用して実行できます。
my_package/my_module.py
で次の静的メソッド:ユニットテストで
import uuid
class MyClass:
@staticmethod
def my_procedure(value):
if isinstance(value, str):
prefix = 'string'
else:
prefix = 'other'
with open('/tmp/%s_%s' % (prefix, uuid.uuid4()), 'w') as f:
f.write(value)
私は次のことをチェックします:
open
と呼ばれてきました。
- 予想されるファイル名が計算されています。
open
がwrite
モードで呼び出されました。
- ファイルハンドルの
write()
メソッドが、予想される引数で呼び出されました。
unittestの:
import unittest
from unittest.mock import patch
from my_package.my_module import MyClass
class MyClassTest(unittest.TestCase):
@patch('my_package.my_module.open', create=True)
def test_my_procedure(self, open_mock):
write_mock = open_mock.return_value.write
MyClass.my_procedure('test')
self.assertTrue(open_mock.call_count, 1)
file_name, mode = open_mock.call_args[0]
self.assertTrue(file_name.startswith('/tmp/string_'))
self.assertEqual(mode, 'w')
self.assertTrue(write_mock.called_once_with('test'))
だけで任意の表明せずに関数を呼び出します。例外が発生した場合、テストは失敗します。 – zvone
したがって、プロシージャが例外を発生しない場合は成功しましたか?次に、try/catchラッパーを使用せずに_without_プロシージャーを呼び出します。 –
はい。プロシージャが例外を発生しない*場合、それは成功しました。例外が発生した場合、そのプロシージャを使用する他のクラスによってキャッチされます。したがって、何か悪いことが起こった場合、unittestメソッドで例外がスローされます。 – daniel451