【问题标题】: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) 来查看该对象在该方法期间是否只设置了一次。

    在模拟属性、命名空间、使用装饰器或上下文管理器时可能会遇到一些麻烦……这取决于很多事情,但我很确定模拟是这里的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-18
      • 2015-12-30
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 2012-03-17
      • 1970-01-01
      相关资源
      最近更新 更多