首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在@patch装饰器创建的对象上模拟方法?

如何在@patch装饰器创建的对象上模拟方法?
EN

Stack Overflow用户
提问于 2019-06-12 02:49:19
回答 1查看 1.2K关注 0票数 1

我正在尝试使用@patch装饰器和模拟对象来测试我的代码使用一些库的行为。不幸的是,我看不到任何方法来做我想要做的事情,只使用装饰器,而且看起来我应该能够做到。我意识到,通常我应该更关注方法的返回值,而不是它对库的特定调用序列,但编写一个测试来将一个图像与另一个图像进行比较是非常困难的。

我想也许我可以创建模拟对象的实例,然后使用@patch.object(...),但这不起作用,显然@patch('MockObject.method')只会模拟类方法。我可以通过使用with patch.object(someMock.return_value, 'method') as mockName让代码正常工作,但这会使我的测试变得混乱。

代码语言:javascript
复制
from some.module import SomeClass


class MockObject:
    def method(self):
        pass


class TestClass:
    @patch('SomeClass.open', return_value=MockObject())
    @patch('??????.method')  # I can't find any value to put here that works
    def test_as_desired(self, mockMethod, mockOpen):
        instance = SomeClass.open()
        instance.method()

        mockOpen.assert_called_once()
        mockMethod.assert_called_once()

    @patch('SomeClass.open', return_value=MockObject())
    def test_messy(self, mockOpen):
        with patch.object(mockOpen.return_value, 'method') as mockMethod:
            instance = SomeClass.open()
            instance.method()

            mockOpen.assert_called_once()
            mockMethod.assert_called_once()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-12 03:22:08

我认为你把事情搞得太复杂了:

代码语言:javascript
复制
import unittest.mock

@unittest.mock.patch.object(SomeClass, open=mock.Mock())
def test_as_desired(self, mock_open):
    instance = SomeClass.open()  # SomeClass.open is a mock, so its return value is too
    instance.method()

    mock_ppen.assert_called_once()
    instance.method.assert_called_once()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56550060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档