如何确保在Django应用程序中使用Mock调用函数

时间:2015-07-03 02:15:34

标签: python django unit-testing mocking

我已经浏览了模拟文档,并且我已经看到了一些使用了mock的示例。但是,作为一个新手,我发现在我的测试中很难使用mock。

test_scoring.py - 我正在创建一个测试,以确保每次创建项目时都不会调用函数。

我想要模拟的功能 compute_score() HistoryItem 类的一部分。

到目前为止我得到的是:

#test_scoring.py

@mock.patch('monitor.report.history_item.HistoryItem.compute_score')
def test_save_device_report(self):
    ....
    result = factory.create_history_item(jsn)
    # If the mocked method gets called after the above function is used, then there should be an error. 

那么,我该如何模拟方法呢?我对如何使用它感到很困惑,因为我找到的资源有不同的方式。

我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

将补丁方法用作装饰器时,需要为测试函数指定第二个参数:

@mock.patch('monitor.report.history_item.HistoryItem.compute_score')
def test_save_device_report(self, my_mock_compute_score):
    ....
    # Assuming the compute_score method will return an integer
    my_mock_compute_score.return_value = 10

    result = factory.create_history_item(jsn)
    # Then simulate the call.
    score = result.compute_score() # This call could not be necessary if the previous
                                   # call (create_history_item) make this call for you.

    # Assert method was called once
    my_mock_compute_score.assert_called_once()
    # Also you can assert that score is equal to 10
    self.assertEqual(score, 10)

请注意,只有在您在另一个测试中测试了已修补的方法或对象时,才应使用模拟。

哪里有补丁? - > https://docs.python.org/3/library/unittest.mock.html#where-to-patch

修改

此补丁将避免真正调用compute_score()。但是,在重新阅读你的帖子之后,我可以看到你想断言你的功能没有被调用。

希望您制作的每个模拟中都存在called属性,因此您可以使用:

@mock.patch('monitor.report.history_item.HistoryItem.compute_score')
def test_save_device_report(self, my_mock_compute_score):
    ...
    result = factory.create_history_item(jsn)
    self.assertFalse(my_mock_compute_score.called)
    ...