测试后在Python中销毁模拟

时间:2014-06-16 16:15:52

标签: python unit-testing mocking python-mock

我们说我有几个这样的测试:

class TestMyTest(unittest.TestCase):

    def SetUpClass(cls):
        cls.my_lib = MyLib()

    def my_first_test(self):
        self.my_lib.my_function = Mock(return_value=True)
        self.assertTrue(self.my_lib.run_my_function(), 'my function failed')

    def my_second_test(self):
        # Some other test that calls self.my_lib.my_function...

让我们说我在MyLib中有类似的东西:

class MyLib(Object):

    def my_function(self):
        # This function does a whole bunch of stuff using an external API
        # ...

    def run_my_function(self):
        result = self.my_function()
        # Does some more stuff
        # ...

在my_first_test中,我正在模拟my_lib.my_function并在执行函数时返回True。在这个例子中,我的断言是调用run_my_function(),它是来自同一个库的另一个函数,除其他外,它调用my_lib.my_function。但是当执行my_second_test时,我不希望调用模拟函数,而是真实调用函数。所以我想我需要在运行my_first_test之后以某种方式销毁模拟,也许在tearDown()期间。我如何销毁那个模拟器?

我编辑了原始问题以添加更多详细信息,因为它看起来不那么清楚,抱歉。

2 个答案:

答案 0 :(得分:2)

你可以这样做:

class TestYourLib(unittest.TestCase):

    def setUp(self):
        self.my_lib = MyLib()

    def test_my_first_test(self):
        self.my_lib.my_function = Mock(return_value=True)
        self.assertTrue(self.run_my_function(), 'my function failed')

    def test_my_second_test(self):
        # Some other test that calls self.my_lib.my_function...

然后,当为下一个测试用例调用Mock时超出范围,setUp被“销毁”。

答案 1 :(得分:1)

销毁模拟器不会这样做。您必须以不同的方式重新分配self.my_lib.my_function或致电Mock(return_value=True)

第一个是帕特里克似乎建议的。