52
def f1():
    return 10, True

def f2():
    num, stat = f1()
    return 2*num, stat

f1()Pythonのモックライブラリを使用してパッチを適用し、カスタム結果を返してテストできるようにするにはどうすればよいf2()ですか?

編集: 私のテストに何か問題がありますか?これは機能していないようです。すべてのテストがAssertionErrorで失敗しました

from foo.bar import f2
from mock import patch

class MyTest(TestCase):

    def test_f2_1(self):
        with patch('project.module.f1') as some_func:
            some_func.return_value = (20, False)
            num, stat = f2()
            self.assertEqual((num, stat), (40, False))

   @patch('project.module.f1')
   def test_f2_2(self, some_func):
       some_func.return_value = (20, False)
       num, stat = f2()
       self.assertEqual((num, stat), (40, False))
4

2 に答える 2

43

最初の例は、同じモジュールで f1() と f2() が定義されていることを示しています。したがって、次のように動作するはずです。

from foo.bar import f2
from mock import patch

class MyTest(TestCase):

    @patch('foo.bar.f1')
    def test_f2_2(self, some_func):
        some_func.return_value = (20, False)
        num, stat = f2()
        self.assertEqual((num, stat), (40, False))

パッチはインポートと同じです:@patch('foo.bar.f1')

この問題に関する良い答えは次のとおりです。

http://bhfsteve.blogspot.nl/2012/06/patching-tip-using-mocks-in-python-unit.html

于 2015-03-15T09:43:25.850 に答える
27

このモックライブラリを使用していると仮定すると、次のようになります。

def f1():
    return 10, True

def f2():
    num, stat = f1()
    return 2*num, stat

import mock

print f2()   # Unchanged f1 -> prints (20, True)

with mock.patch('__main__.f1') as MockClass:       # replace f1 with MockClass 
    MockClass.return_value = (30, True)     # Change the return value

    print f2()     # f2 with changed f1 -> prints (60, True)

__main__.f1コードがモジュールに分割されている場合は、モジュール/関数へのパスに置き換える必要があります。

于 2012-04-23T09:10:03.467 に答える