8

別のモジュールからインポートされた別のメソッドを呼び出すモジュールに次のメソッドがあります。

def imported_function():
    do_unnecessary_things_for_unittest()

上記の関数をテスト、インポート、および使用する必要がある実際のメソッド:

from somewhere import imported_function

def function_to_be_tested():
    imported_function()
    do_something_more()
    return 42

import_function内の内部呼び出しと関連する計算は重要ではなく、テストしたいものではないため、実際の関数function_to_be_testedをテストするときにスキップしたいと思います。

したがって、テストメソッド内のどこかに名前が付けられたモジュールにモンキーパッチを適用しようとしましたが、うまくいきませんでした。

def test_function_to_be_tested(self):
    import somewhere
    somewhere.__dict__['imported_function'] = lambda : True

問題は、テスト中にモジュールのメソッドにモンキーパッチを適用して、テストフェーズ中に呼び出されないようにする方法です。

4

2 に答える 2

15

Mock Libraryを使ったほうがいいと思います

したがって、次のようなことができます。

from somewhere import imported_function

@patch(imported_function)
def test_function_to_be_tested(self, imported_function):
    imported_function.return_value = True
    #Your test

単体テストの場合は、モンキー パッチよりも優れていると思います。

于 2012-08-31T08:34:23.283 に答える
8

次のファイルがあるとします。

どこか.py

def imported_function():
    return False

testme.py

from somewhere import imported_function

def function_to_be_tested():
    return imported_function()

を呼び出すと、testme.function_to_be_tested()が返されFalseます。


さて、トリックはsomewhere testmeにインポートすることです:

import somewhere
somewhere.__dict__['imported_function'] = lambda : True

import testme
def test_function_to_be_tested():
    print testme.function_to_be_tested()

test_function_to_be_tested()

出力:

真実


または、testmeモジュールをリロードします

import testme

def test_function_to_be_tested():
    print testme.function_to_be_tested()
    import somewhere
    somewhere.__dict__['imported_function'] = lambda : True
    print testme.function_to_be_tested()
    reload(testme)
    print testme.function_to_be_tested()

test_function_to_be_tested()

出力:



于 2012-08-31T08:01:05.847 に答える