Python的单元测试unittest中的Mock使用小结

前面一篇博文简单说了使用unittest.mock对无返回值的函数做单元测试。这里是更多一些例子的总结。

被测函数中使用到了input需要自动化输入

#!/usr/bin/env python3

from unittest import TestCase
from unittest.mock import patch
from unittest import main

def func_input():
    name = input("Enter your name: ")
    print('Your name is {}'.format(name))

def test_func_input():
    with patch('builtins.input') as mocked_input:
        mocked_input.side_effect = ('Jo',)  #当input的时候会输入Jo
        with patch('builtins.print') as mocked_print:
            func_input()
            mocked_print.assert_called_with('Your name is Jo')

if __name__ == '__main__':
    main()

需要验证函数是否被“被测函数“调用

#!/usr/bin/env python3

from unittest import TestCase
from unittest.mock import patch
from unittest import main


def func_1():
    func_2()

def func_2():
    print("It's func 2!")

def test_func_1():
    with patch('func_2') as mocked_func_2:
        func_1()
        mocked_func_2.assert_called_once()  #断言mocked_func_2被调用过一次,在执行func_1()后

if __name__ == '__main__':
    main()

mock.patch()和mock.patch.object()的区别

这一块我还不是特别明白,搜索了下,大致区别如下

mock.patch() doesn’t require that you import the object before patching, while mock.patch.object() does require that you import before patching

有一个遗留问题,如下代码中,完全不能使用mock.patch()吗?

# py_unittest.py

from unittest import TestCase
from unittest.mock import patch
from unittest import main


class Person(object):
    def __init__(self, name):
        self.name = name

    def print_name(self):
        print('My name is ' + self.name)

    def print_parents(self):
        mother = input("Enter mother's name: ")
        father = input("Enter father's name: ")

        print("{}'s parents are {} and {}.".format(self.name, mother, father))
        self.fake_func()

    def fake_func(self):
        pass

class FuncTest(TestCase):
    def test_print_parents(self):
        john = Person('John')

        with patch('builtins.input') as mocked_input:
            mocked_input.side_effect = ('Jo', 'Lee')
            with patch('builtins.print') as mocked_print:
                with patch.object(Person, "fake_func") as mocked_fake_func:
                # with patch('Person.fake_func') as mocked_fake_func: 启用这里的话,会报
                # 错 ModuleNotFoundError: No module named 'Person'
                    john.print_parents()
                    mocked_print.assert_called_with("John's parents are Jo and Lee.")
                    mocked_fake_func.assert_called_once()

if __name__ == '__main__':
    main()

版权声明:本文为python012原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。