首页 > 解决方案 > 单元测试检查是否主要调用方法

问题描述

我有一个main看起来像这样的方法:

class Example:
    ...
    def main(self):
        self.one()
        self.two(list)
        self.three(self.four(4))

如何检查调用main它是否调用了它里面的以下方法?

我努力了:

def setUp(self):
    self.ex = example.Example()

def test_two(self):
    # testing method two that has only list.append(int) and returns list
    mock_obj = Mock()
    self.ex.two(mock_obj, 1)
    self.assertEqual(call.append(1),mock_obj.method_calls[0]) # works fine
    mock_obj.method.called # throws False ...why?

def test_main(self):
    with patch('example.Example') as a:
    a.main()
    print(a.mock_calls)  # [call.main()]

...
def test_main(self):
    mock_obj = Mock()
    self.ex.main(mock_obj) # throws TypeError: main() takes exactly 1 argument (2 given)
    print(mock_obj.method_calls) # expected one, two, three and four method calls

老实说,真的需要任何帮助。

将 Python 2.6.6 与 unittest 和 mock 模块一起使用

标签: pythonunit-testingmocking

解决方案


通过单元测试,您原则上可以测试这四个函数是否真的会被调用。而且,您当然可以通过嘲笑所有这些来做到这一点。但是,无论如何,您以后都需要进行集成测试,以确保函数以正确的顺序被调用,参数的顺序正确,参数的值是被调用者期望的形式,返回值是预期的形式等。

你可以在单元测试中检查所有这些东西——但这没有多大价值,因为如果你对这些点之一有错误的假设,你的错误假设将进入你的代码和单元测试。也就是说,单元测试将完全针对您的错误假设进行测试并且会通过。找出你的错误假设需要一个集成测试,其中真正的调用者和被调用者聚集在一起。

总结:您的主要方法是交互主导的,因此应该直接通过交互测试(也称为集成测试)进行测试,而不是通过单元测试加上后续的交互测试。


推荐阅读