python - 从类方法中模拟/修补计算属性的值

标签 python unit-testing mocking patch

我正在尝试为一个调用对象的类方法的函数编写测试——这个类方法继续返回该类的一个新实例。

在 stackoverflow 和其他地方有很多修补类属性的示例,但我很难理解如何修补属性/值以便我可以测试我的函数。我提到了 this回答。

本质上,我正在尝试修补 Foo 实例(在 myFn 中)的属性 xxxx,以便我可以测试/断言其对 some_other_function()

下面的代码是独立的“可运行”问题:我收到一个 AttributeError: Foo 没有属性“xxxx”

import time
import unittest
from unittest.mock import patch, PropertyMock

class Foo(object):
    def __init__(self, xxxx):
        """long running task"""
        time.sleep(5)
        self.xxxx = xxxx

    @classmethod
    def get(cls):
        """also a long running task"""
        time.sleep(5)
        xxxx = 555
        return cls(xxxx)

def myFn():
    v = Foo.get().xxxx
    # the patched `xxxx` should be 666 at this point
    return some_other_function(v)

class Test(unittest.TestCase):

    @patch('__main__.Foo', autospec=True)
    def test_myFn(self, mock_Foo):
        with patch('__main__.Foo.xxxx', new_callable=PropertyMock, return_value=666):
            x = myFn()
            self.assertEqual(x, 666)

if __name__ == '__main__':
    unittest.main()

非常感谢任何人的帮助!

最佳答案

你应该使用 create如果属性不存在,将强制创建属性的参数:

def test_myFn(self):
    with patch('__main__.xxxx', new_callable=PropertyMock, create=True, return_value=666):
        x = myFn()
        self.assertEqual(666,x)

关于python - 从类方法中模拟/修补计算属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63286643/

相关文章:

python - oauth2client/appengine.py 返回 "InvalidResponseError: header values must be str, got ' unicode'"与 webapp2/python27/wsgi

unit-testing - 什么是单元测试和集成测试,我应该了解哪些其他类型的测试?

unit-testing - 如何从 webstorm 文件观察器运行 "npm test"

tdd - 单元测试、模拟对象和 ioc 的最佳实践

java - Mockito 允许不同的参数类型模拟重载方法

python - 如何检查数组是否为空?

python - Gefran 800P 和 minimalmodbus (Mac) : "ValueError: Too short Modbus RTU response (minimum length 4 bytes). Response: '\x0 0' "

python - 如何禁用 Gtk 上的所有默认按键

unit-testing - 让 PartCover 发挥作用

node.js - Mockgoose 测试失败导致 MongoError : topology was destroyed