Python Mock:patch和return_value的意外结果

4 投票
1 回答
608 浏览
提问于 2025-04-16 15:27

我先贴一些代码,这样会更清楚。

我的类:

from tools import get_knife, sharpen

class Banana(object):
    def chop(self):
        knife = get_knife()
        sharpen(knife)

我的测试:

from mock import patch, sentinel
from banana import Banana

class TestBanana(unittest.TestCase):

    @patch('banana.get_knife')
    @patch('banana.sharpen')
    def test_chop(self, get_knife_mock, sharpen_mock):
        get_knife_mock.return_value = sentinel.knife
        Banana().chop()
        sharpen_mock.assert_called_with(sentinel.knife)

这个测试会失败,因为 sharpen_mock 没有用 get_knife_mock 的返回值来调用。

1 个回答

4

请注意,装饰器是从下往上应用的。这是Python应用装饰器的标准方式。传递给你的测试函数的模拟对象的顺序也和这个顺序一致。

http://www.voidspace.org.uk/python/mock/patch.html#nesting-patch-decorators

撰写回答