モジュールの単体テストを実装しようとしました。次のようにalphabet.pyという名前のモジュール例は次のとおりです。グローバル変数を模擬しました
import database
def length_letters():
return len(letters)
def contains_letter(letter):
return True if letter in letters else False
letters = database.get('letters') # returns a list of letters
私は私の選択のいくつかの値を使用してデータベースからの応答を模擬したいのですが、以下のコードが動作するようには思えません。
import unittests
import alphabet
from unittest.mock import patch
class TestAlphabet(unittest.TestCase):
@patch('alphabet.letters')
def setUp(self, mock_letters):
mock_letters.return_value = ['a', 'b', 'c']
def test_length_letters(self):
self.assertEqual(3, alphabet.length_letters())
def test_contains_letter(self):
self.assertTrue(alphabet.contains_letter('a'))
「パッチ」がメソッドやクラスには適用されますが、変数には適用されない例が多数あります。私はメソッドdatabase.getにパッチを適用したくないので、後で別のパラメータで再度使用するかもしれないので、私は別の応答が必要です。
私はここで間違っていますか?
この方法の残念なことに、このモジュールレベル変数を使用する他のテストでは、古い値を保存して戻さない限り、失敗します。あなたのために嘲笑がこの世話をします。 –
'alphabet.letters'の値を' tearDown'関数の元の値に戻すことができます。 – tomas
また、 'setUp'はテストクラス全体にスコープされているので、この1つの値は' letters'にしか使用できません。以下の答えは、さまざまなテストケースに対して複数のモックを作成できるようにします。最後に自分自身をクリーンアップするので、誤ったテスト汚染のリスクはありません。 – raindrift