繁体   English   中英

Python单元测试最佳实践,以避免猴子补丁错误

[英]Python unit test best practice to avoid monkey patching bug

我刚刚在单元测试中遇到了一个错误,因为从本质上讲,我是在像这样的设置中修补猴子:

def test_some_class_to_string():
    some_class = SomeClass()
    some_class.foo = 'bar'
    some_class.monkey_patched = 'baz'
    assert str(some_class) == 'barbaz'

class SomeClass(models.Model):
    foo = models.CharField(max_length=100)

    def __str__(self):
        #monkey_patched property removed from model
        return '{0}{1}'.format(self.foo, self.monkey_patched)

我已经从SomeClass中删除了一个属性,但是由于在运行时重新添加了monkey_patched,str方法仍在单元测试中通过。

最好通过在设置任何属性之前将str(some_class)作为附加测试来处理这种特殊情况,还是应该在单元测试中始终使用关键字参数来初始化类?

您可以在分配之前尝试断言:

def test_some_class_to_string():
    some_class = SomeClass()
    assert some_class.foo and some_class.bar
    some_class.foo = 'bar'
    some_class.monkey_patched = 'baz'
    assert str(some_class) == 'barbaz'

使用类似mock的库来帮助您完成此操作。 假设您有一个定义如下的类:

class A:
    def __init__(self, x):
        self.x = x
        self.y = 6

现在,而不是简单地创建实例的A ,并做一切你想做的事情,创建一个模拟对象,它是一个实例的仪表版本 A

>>> m = unittest.mock.Mock(spec_set=A)
>>> m.z = 9
Traceback (most recent call last):
  File "tmp.py", line 11, in <module>
    m.z = 9
  File ".../unittest/mock.py", line 684, in __setattr__
    raise AttributeError("Mock object has no attribute '%s'" % name)
AttributeError: Mock object has no attribute 'z'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM