我刚刚遇到了我的单元测试的错误,因为我基本上是在设置中进行猴子修补:
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)作为附加测试来处理这种特殊情况,还是应该总是使用关键字参数来初始化单元测试中的类?
答案 0 :(得分:1)
您可以在分配之前尝试断言:
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'
答案 1 :(得分:1)
使用像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'