假设模型字段默认为None
,并且经过一些复杂操作后的方法预计将字段更改为None
。
在测试结束时,我做到了assertEqual
,并且该领域None
符合预期。如果该方法无声无息地失败并且None
不是该方法操作的结果而仅仅是巧合怎么办?
有没有办法确定模型字段更改而不必在测试开始时设置不同的值?
在我的情况下,它是ForeignKey
来自另一个包的复杂对象的字段。
解决此问题的最佳方法是什么?
假设模型字段默认为None
,并且经过一些复杂操作后的方法预计将字段更改为None
。
在测试结束时,我做到了assertEqual
,并且该领域None
符合预期。如果该方法无声无息地失败并且None
不是该方法操作的结果而仅仅是巧合怎么办?
有没有办法确定模型字段更改而不必在测试开始时设置不同的值?
在我的情况下,它是ForeignKey
来自另一个包的复杂对象的字段。
解决此问题的最佳方法是什么?
这个问题已经开放了很长一段时间了,我不确定你是否还需要答案,但是我昨天在寻找其他东西时发现了它,现在我有一些空闲时间,所以......
我不是专家,它实际上可能无法满足您的特定需求,但在我看来,您需要一个模拟库。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)
来查看对象是否在方法期间只设置了一次。
您可能会在模拟属性、命名空间、使用装饰器或上下文管理器时遇到一些麻烦……这取决于很多事情,但我很确定模拟是这里的方法。