其他模块的模拟功能

时间:2014-12-04 19:49:51

标签: python unit-testing mocking python-unittest python-mock

我有两个python文件:

function.py:

def foo ():
    return 20

def func ():
    temp = foo()
    return temp

和mocking.py:

 from testing.function import *
 import unittest
 import mock
 class Testing(unittest.TestCase):

 def test_myTest(self):

     with mock.patch('function.func') as FuncMock:
         FuncMock.return_value = 'string'

         self.assertEqual('string', func())

我想模拟func,但没有积极的结果。我有AssertionError:' string' != 20.我该怎么做才能正确嘲笑它?如果我做mock.patch(' func')我有TypeError:需要一个有效的目标来修补。您提供了:' func'。如果我将func移动到mocking.py并调用foo:function.foo()它可以正常工作。但是,当我不想将函数从function.py移动到mocking.py时,如何做到这一点?

1 个答案:

答案 0 :(得分:2)

当您调用实际函数时,模拟很有用,但您希望模拟该函数内部的某些函数调用。在您的情况下,您的目标是模仿func,并希望通过func()直接调用该模拟函数。

然而,由于您正在嘲笑function.func但您已经将func已导入测试文件中,因此无法正常工作。因此,您调用的func()是实际功能,它与模拟的FuncMock不同。尝试拨打FuncMock(),然后按预期获得结果。

以下内容应该有效,它可以让您了解可以做些什么:

from testing.function import func
import unittest
import mock

class Testing(unittest.TestCase):

    def test_myTest(self):

        with mock.patch('testing.function.foo') as FooMock:
            FooMock.return_value = 'string'

            self.assertEqual('string', func())