【问题标题】:Django - Testing model field changeDjango - 测试模型字段更改
【发布时间】:2012-12-28 03:31:56
【问题描述】:
假设模型字段默认为None,并且经过一些复杂操作后的方法预计将字段更改为None。
在测试结束时,我执行assertEqual,字段为None,正如预期的那样。如果该方法静默失败并且None 不是该方法操作的结果而仅仅是巧合呢?
有没有一种方法可以确定模型字段的变化,而不必在测试开始时设置不同的值?
在我的情况下,它是来自另一个包的复杂对象的 ForeignKey 字段。
最好的方法是什么?
【问题讨论】:
标签:
django
unit-testing
django-models
django-testing
【解决方案1】:
这个问题已经有很长一段时间了,我不确定你是否还需要答案,但我昨天在搜索其他内容时找到了它,现在我有一些空闲时间,所以......
我不是专家,它实际上可能无法满足您的特定需求,但在我看来,您需要一个模拟库。 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) 来查看该对象在该方法期间是否只设置了一次。
在模拟属性、命名空间、使用装饰器或上下文管理器时可能会遇到一些麻烦……这取决于很多事情,但我很确定模拟是这里的方法。