为了账号安全,请及时绑定邮箱和手机立即绑定

具有模拟和多个功能的单元测试

具有模拟和多个功能的单元测试

绝地无双 2023-05-09 15:32:49
我不能实例化一个对象,因为它是一个抽象类,所以我必须使用模拟来测试我的代码。有人告诉我,最好通过创建一个新mock类来完成。class MockMyClass(MyClass):     def my_first_function(...):这个想法是我然后实例化一个MockMyClass对象,我可以在其中测试私有函数。我已经阅读了 python指南并研究了其他堆栈问题。到这里,mock背后的理论已经很好的解释了。不幸的是,我仍然不知道如何在大型单元测试中为多个函数使用模拟。例如:如果我有一个类,主代码中的其他类从中继承函数。这可以采用以下形式:class SharedFunctions(AnotherClass):    first_function():        #do some important calculations to generate stuff.#        self.stuff = first_function_attribute_stuff        return returned_first_stuff    second_functions(returned_stuff)        returned_second_stuff = self.stuff + returned_first_stuff                return returned_second_stuff并且该类SharedFunctions还继承自另一个类(注意抽象方法)的形式:class AnotherClass():    @abc.abstractmethod    def one_important_universal_function(...):        pass我试图unittest为SharedFunctions这段代码构建一个。到目前为止,这是我尝试过的:class MockSharedFunctions(SharedFunctions):    def first_function(...):        self.stuff = some value        returned_first_stuff = given some other value        return returned_first_stuff    def second_function        returned_second_stuff = another value.        return returned_second_stuffclass TestSharedFunctions(unittest.TestCase):    def test_first_function(self):        # insert code #        self.assertTrue(True)    def test_second_function(self):        # insert code #        self.assetEqual(output, expected)        self.assertTrue(True)if __name__ == "__main__":    unittest.main()insert code使用模拟的各种尝试在哪里。但是,我还没有找到一个清楚的例子来说明如何使用模拟函数来替换其他函数,或者确认这会起作用。感谢您的任何帮助。
查看完整描述

1 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

一个常见的问题是模拟函数的使用过于复杂。您几乎可以像对待另一个类方法一样对待它们。在您的情况下,abstractmethod装饰器可能会造成混乱。


这接近您可能需要的东西。


class MockSharedFunctions(SharedFunctions):

    def one_important_universal_function(**args):

        return 0


class TestSharedFunctions(unittest.TestCase):

    def test_first_function(self):

        mock = MockSharedFunctions()

        mock_output = firstfunction(**args)

        mock_stuff = mock.stuff


        self.assertTrue(True)

        self.assetEqual(mock_output, expected)

        self.assetEqual(mock_stuff, expected)


    def test_second_function(self):

        mock = MockSharedFunctions()

        mock.stuff = some_value

        mock_output = second_function(**args)


        self.assetEqual(mock_output, expected)

        self.assertTrue(True)


if __name__ == "__main__":

    unittest.main()

在这里,MockSharedFunctions您已经在继承SharedFunctions. 作为one_important_universal_function一个抽象方法,它需要被定义。


查看完整回答
反对 回复 2023-05-09
  • 1 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信