python教程—使用python的模拟补丁。对象,以更改在另一个方法中调用的方法的返回值-Python实用宝典

python教程—使用python的模拟补丁。对象,以更改在另一个方法中调用的方法的返回值

是否可以模拟在我要测试的另一个函数中调用的函数的返回值?我希望模拟方法(它将在我测试的许多方法中被调用)每次调用时返回指定的变量。例如:

是否可以模拟在我要测试的另一个函数中调用的函数的返回值?我希望模拟方法(它将在我测试的许多方法中被调用)每次调用时返回指定的变量。例如:

    class Foo: def method_1(): results = uses_some_other_method() def method_n(): results = uses_some_other_method()

在单元测试中,我想使用mock更改uses_some_other_method()的返回值,以便在Foo中调用它时,它将返回我在@patch.object(…)中定义的内容。

回答

有两种方法可以做到这一点;用patch和patch。object

Patch假设您没有直接导入对象,而是您正在测试的对象正在使用它,如下所示

    #foo.py def some_fn(): return 'some_fn' class Foo(object): def method_1(self): return some_fn()
    #bar.py import foo class Bar(object): def method_2(self): tmp = foo.Foo() return tmp.method_1()
    #test_case_1.py import bar from mock import patch @patch('foo.some_fn') def test_bar(mock_some_fn): mock_some_fn.return_value = 'test-val-1' tmp = bar.Bar() assert tmp.method_2() == 'test-val-1' mock_some_fn.return_value = 'test-val-2' assert tmp.method_2() == 'test-val-2'

如果直接导入要测试的模块,可以使用patch。对象如下:

    #test_case_2.py import foo from mock import patch @patch.object(foo, 'some_fn') def test_foo(test_some_fn): test_some_fn.return_value = 'test-val-1' tmp = foo.Foo() assert tmp.method_1() == 'test-val-1' test_some_fn.return_value = 'test-val-2' assert tmp.method_1() == 'test-val-2'

在这两种情况下,some_fn都将在测试函数完成后被“取消模拟”。

编辑:
为了模拟多个函数,只需向函数添加更多装饰器,并添加参数以接受额外的参数

    @patch.object(foo, 'some_fn') @patch.object(foo, 'other_fn') def test_foo(test_other_fn, test_some_fn): ...

注意,decorator离函数定义越近,它在参数列表中的位置就越早。

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
1

发表评论