假设模型字段默认为None
,并且某个复杂操作后的方法应该将字段更改为None
。
在测试结束时,我会assertEqual
,字段为None
,符合预期。如果方法无声地失败并且None
不是方法操作的结果而只是巧合,该怎么办?
有没有办法确定模型字段更改,而无需在测试开始时设置不同的值?
在我的情况下,它是来自另一个包的复杂对象的ForeignKey
字段。
最好的方法是什么?
答案 0 :(得分:0)
这个问题已经开放了很长一段时间,我不确定你是否还需要一个答案,但我昨天在搜索其他东西的时候找到了它,现在我有一些空闲时间,所以......
我不是专家,实际上可能无法满足您的特定需求,但在我看来,您需要一个模拟库。 Michael Foord的Mock是最受欢迎的作品之一。
你可以做的是使用mock.patch
作为装饰器或上下文管理器来模拟你试图测试的属性,如下所示:
def test_attribute_is_being_set_to_none():
mocked_attribute = mock.PropertyMock()
with mock.patch('MyModule.MyClass.attribute_to_mock', mocked_attribute)
MyObject = MyClass()
MyObject.method()
p.assert_called_with(None)
这应该测试在测试时是否将属性设置为None
。如果您想要更加严格,可以使用assert_called_once_with(None)
查看对象是否仅在方法期间设置了一次。
你可能会遇到一些麻烦,嘲笑属性,命名空间,使用装饰器或上下文管理器......这取决于很多东西,但我很确定嘲笑是去这里的方法。