具有Mock的Django UnitTest

孟杰|

我正在为基于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()当我测试整个基于类的视图时,该如何模拟呢?

米歇尔·达米科

什么你正在寻找的是patchunittest.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设置返回值或副作用。

我没有提供任何有关启动和停止方法的示例(我不太喜欢),但是我想花一些时间在两个细节上

  1. 我假设您在my_view模块中定义call_external_api或导入它,from my_API_module import call_external_api否则应注意在何处打补丁
  2. 我用过autospec=True:恕我直言,应该在每个补丁程序调用中使用它,并且文档说明为什么很好

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有ModelChoiceField和Mock数据的UnitTest ModelForm

来自分类Dev

Using on UnitTest Mock-DbContext

来自分类Dev

带有 appium unittest 的 FileOpenPicker

来自分类Dev

在UnitTest Mock-DbContext上使用

来自分类Dev

unittest Mock-补丁返回值

来自分类Dev

在UnitTest Mock-DbContext上使用

来自分类Dev

unittest Mock-补丁返回值

来自分类Dev

Django test.TestCase与unittest.TestCase

来自分类Dev

Django测试unittest.loader.ModuleImportFailure

来自分类Dev

Django测试unittest.loader.ModuleImportFailure

来自分类Dev

Unittest teardown()删除所有属性

来自分类Dev

Python中带有unittest的相对导入

来自分类Dev

带有unittest和Multiples模块的ImportError

来自分类Dev

自定义unittest.mock.mock_open以进行迭代

来自分类Dev

为什么 unittest.mock.ANY 不能与 Django 对象一起正常工作?

来自分类Dev

带有Unittest的Flask-WTF / WTForms验证失败,但没有Unittest即可工作

来自分类Dev

Python unittest:来模拟.patch()还是只用Mock替换方法?

来自分类Dev

python的unittest.mock.patch是否会改变全局状态?

来自分类Dev

在Python 3中使用unittest.mock修补input()

来自分类Dev

python的`unittest.mock.patch`是否会改变全局状态?

来自分类Dev

unittest.mock.patch 中的意外行为

来自分类Dev

Python的unittest和unittest2模块之间有什么区别?

来自分类Dev

如何在django unittest中测试django会话?

来自分类Dev

如何使用unittest修补具有不同返回值的链接函数?

来自分类Dev

Django / DjangoRestFramework-unittest无法验证使用ORM创建的用户

来自分类Dev

在主Django数据库上运行Unittest

来自分类Dev

使用新数据库启动django unittest

来自分类Dev

django UnitTest案例中的伪造子功能(模拟)

来自分类Dev

Django / DjangoRestFramework-unittest无法验证使用ORM创建的用户

Related 相关文章

  1. 1

    具有ModelChoiceField和Mock数据的UnitTest ModelForm

  2. 2

    Using on UnitTest Mock-DbContext

  3. 3

    带有 appium unittest 的 FileOpenPicker

  4. 4

    在UnitTest Mock-DbContext上使用

  5. 5

    unittest Mock-补丁返回值

  6. 6

    在UnitTest Mock-DbContext上使用

  7. 7

    unittest Mock-补丁返回值

  8. 8

    Django test.TestCase与unittest.TestCase

  9. 9

    Django测试unittest.loader.ModuleImportFailure

  10. 10

    Django测试unittest.loader.ModuleImportFailure

  11. 11

    Unittest teardown()删除所有属性

  12. 12

    Python中带有unittest的相对导入

  13. 13

    带有unittest和Multiples模块的ImportError

  14. 14

    自定义unittest.mock.mock_open以进行迭代

  15. 15

    为什么 unittest.mock.ANY 不能与 Django 对象一起正常工作?

  16. 16

    带有Unittest的Flask-WTF / WTForms验证失败,但没有Unittest即可工作

  17. 17

    Python unittest:来模拟.patch()还是只用Mock替换方法?

  18. 18

    python的unittest.mock.patch是否会改变全局状态?

  19. 19

    在Python 3中使用unittest.mock修补input()

  20. 20

    python的`unittest.mock.patch`是否会改变全局状态?

  21. 21

    unittest.mock.patch 中的意外行为

  22. 22

    Python的unittest和unittest2模块之间有什么区别?

  23. 23

    如何在django unittest中测试django会话?

  24. 24

    如何使用unittest修补具有不同返回值的链接函数?

  25. 25

    Django / DjangoRestFramework-unittest无法验证使用ORM创建的用户

  26. 26

    在主Django数据库上运行Unittest

  27. 27

    使用新数据库启动django unittest

  28. 28

    django UnitTest案例中的伪造子功能(模拟)

  29. 29

    Django / DjangoRestFramework-unittest无法验证使用ORM创建的用户

热门标签

归档