【问题标题】:Destroy a mock in Python after the test测试后在 Python 中销毁一个 mock
【发布时间】:2014-08-06 12:51:23
【问题描述】:

假设我有几个这样的测试:

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() 期间。如何销毁该模拟?

我编辑了我的原始问题以添加更多细节,因为看起来不是那么清楚,对此感到抱歉。

【问题讨论】:

  • 您的对象是否在对自己进行测试并模拟自己的实现?那是自找麻烦。通常你有一个测试类(使用内置的unittest),它与被测试的类不同。编辑 - 这将为每个测试创建一个新的对象实例,因此无需重置状态。
  • 我用他的self.assertTrue 来表示这一切都在unittest.TestCase 内部,但为了简单起见,它被省略了。如果不是这样,那就大错特错了。
  • @PatrickCollins 但是self.my_lib.my_function 呢?这看起来像是测试对象的实现,或者他在设置中保留了一个对象。也许你是对的,是后者。

标签: python unit-testing mocking python-mock


【解决方案1】:

你可以这样做:

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...

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

【讨论】:

  • 你搞错了。 run_my_function 没有被嘲笑,它是被测试的方法。嘲笑正在测试的东西有 0.00% 的意义。被嘲笑的是my_lib...,因为run_my_function 正在使用它,我们也不想测试mylib。这是一个完全标准的用例,唯一不与my_lib 混淆的方法是依赖注入everything,这是不受欢迎且不实用的。
  • 我认为这个测试没有多大意义,但它似乎是 @Cas 要求的。
  • 对不起,我的问题让大家感到困惑,感谢您的回答。为了澄清我想要做的事情,是测试 my_lib 中的函数,但是其中一些方法从同一个库中调用其他方法,在我的示例中,run_my_function 是一种利用 my_function 完成其工作的方法(也许我在示例中使用的名称不是最好的:()。但是当测试一种方法依赖于另一种方法时,我想模拟当时未测试的方法。
  • @PatrickCollins 但是,正如 delnan 所说,您回答的第一部分对我来说也没有多大意义,在这种情况下,您正在嘲笑被测方法,从那时起您就没有任何意义不会测试任何东西。如果您编辑该答案,我可以将您的答案标记为已接受的答案。 :)
  • @Cas 我按照你的建议进行了编辑。如果您认为可以改进,请告诉我。
【解决方案2】:

破坏模拟是不行的。您要么必须重新分配self.my_lib.my_function,要么以不同的方式调用Mock(return_value=True)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多