我正在为基于Django类的视图编写单元测试。
class ExampleView(ListView):
def get_context_data(self, **kwargs):
context = super(EampleView, self).get_context_data(**kwargs)
## do something else
def get_queryset(self, **kwargs):
return self.get_data()
def get_data(self):
call_external_API()
## do something else
关键问题在于call_external_API()
中get_data()
。
在编写单元测试时,我真的不想调用外部API来获取数据。首先,那会花我的钱;其次,我可以轻松地在另一个测试文件中测试该API。
我也可以get_data()
通过仅对其进行单元测试并模拟的输出来轻松测试此方法call_external_API()
。
但是,当我测试整个基于类的视图时,我只会做
self.client.get('/example/url/')
并检查状态码和上下文数据以进行验证。
在这种情况下,call_external_API()
当我测试整个基于类的视图时,该如何模拟呢?
什么你正在寻找的是patch
从unittest.mock
。您可以call_external_api()
按MagicMock()
对象进行修补。
也许您想为call_external_api()
课堂上的所有测试打补丁。patch
给你基本的两种方法
start()
和stop()
insetUp()
和tearDown()
用patch
装饰器装饰类就像装饰所有测试方法(有关详细信息,请参见文档),实现将非常简洁。以下示例假定您的视图位于my_view
模块中。
@patch("my_view.call_external_api", autospec=True)
class MyTest(unittest.TestCase):
def setUp(self):
self.client = Client()
def test_get_data(self, mock_call_external_api):
self.client.get('/example/url/')
self.assertTrue(mock_call_external_api.called)
可以构建更多复杂的示例,您可以检查调用方式mock_call_external_api
并为API设置返回值或副作用。
我没有提供任何有关启动和停止方法的示例(我不太喜欢),但是我想花一些时间在两个细节上:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句