我已经浏览了模拟文档,并且我已经看到了一些使用了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.
那么,我该如何模拟方法呢?我对如何使用它感到很困惑,因为我找到的资源有不同的方式。
我非常感谢你的帮助。
答案 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)
...