6

Python 関数をテストするにはos.listdir、他の関数にパッチを適用する必要があります。osしかし、パッチが適用されると、importステートメントは失敗します。この関数にパッチを当てて、tests.py を正常に動作させたままにすることはできますか?

壊れる例を次に示しますimport

import os
from mock import patch

# when both isdir and isfile are patched
# the function crashes
@patch('os.path.isdir', return_value=False)
@patch('os.path.isfile', return_value=False)
def test(*args):
    import ipdb; ipdb.set_trace()
    real_function(some_arguments)
    pass

test()

real_functionパッチが適用されたos.pathと、通常の機能を確認するためのテストが必要です。

ここにトレースバックがあります

4

4 に答える 4

9

patchコンテキストマネージャーとして使用できるため、withステートメント内のコードにのみ適用されます。

import os
from mock import patch

def test(*args):
    import ipdb; ipdb.set_trace()
    with patch('os.path.isdir', return_value=False):
        with patch('os.path.isfile', return_value=False):
            real_function(some_arguments)
    pass

test()
于 2012-09-28T13:31:46.600 に答える
0

patch は、テスト メソッドまたはテスト クラスのデコレータとして使用できます。非常にきれいなコードになります。パッチが適用されたオブジェクトがテスト メソッドに渡されることに注意してください。テスト クラス レベルで同じことを行うと、モック オブジェクトがすべてのテスト メソッドに渡されます。この場合、すべて自動的に処理されるため、setUp または tearDown を使用する必要はありません。

# module.py
import os

def tested_func(path):
    return os.listdir(path * 2)


# test.py
from mock import patch

@patch('module.os.listdir')
def test_tested_func(self, mock_listdir):
    mock_listdir.return_value = ['a', 'b']

    self.assertEqual(tested_func('some_path'), ['a', 'b', 'a', 'b'])
    mock_listdir.assert_called_with('some_path' * 2)

また、実際にテストするモジュールで、パッチを適用する関数をモックしていることにも注意してください。

于 2012-09-27T13:51:26.130 に答える
0

あなたはそれを「できる」だけでなく、「すべき」ですhttp://mock.readthedocs.org/en/latest/patch.html#where-to-patch

ps: パッチを適用するユニットの副作用をより「宣言的な」方法で記述したい場合は、ライブラリhttp://mockstar.readthedocs.org/を使用することをお勧めします

于 2012-09-28T13:26:13.417 に答える
0

以下は、必要なものに対して機能します。すべてが正しい状態に戻ったことを示すために、テスト実行の前後に os.listdir を出力していることに注意してください。

import unittest, os
from unittest import TestLoader, TextTestRunner

def tested_func(path):
    return os.listdir(path * 2)

class Example(unittest.TestCase):

    def setUp(self):
        self._listdir = os.listdir
        os.listdir = lambda p: ['a', 'b', 'a', 'b']

    def test_tested_func(self):
        self.assertEqual(tested_func('some_path'), ['a', 'b', 'a', 'b'])

    def tearDown(self):
        os.listdir = self._listdir

print os.listdir
TextTestRunner().run(TestLoader().loadTestsFromTestCase(Example))
print os.listdir
于 2012-09-27T12:51:18.537 に答える