【问题标题】:Unit-testing Python: Mocking function calls inside function单元测试 Python:在函数内部模拟函数调用
【发布时间】:2015-11-13 23:14:01
【问题描述】:

我有一个像这样的 django 视图

# Django view

from some_module import f2
def f1(request, version):
    # some code

    f2(**kargs)

    # more code
    return HTTPResponse(response)

函数 f2 在另一个模块中

# some_module
def f2(**kargs):
    # some code

Django 视图是 API 的一部分,因此请求和响应都在 json 中

我该怎么做:

  1. 在模拟请求时为此函数编写单元测试
  2. mock f2,这是一个基于数据库的函数,完全避免数据库连接

编辑:

我使用的数据库是 Cassandra,所以我不能使用 django.db

【问题讨论】:

    标签: python django unit-testing mocking


    【解决方案1】:

    您可以在单元测试中使用@mock.patch 装饰器来模拟f2() 方法。

    import mock
    import some_module
    from django.test import TestCase
    
    def mocked_f2(**kargs):
        return 'Hey'
    
    class YourTestCase(TestCase):
    
        @mock.patch('some_module.f2', side_effect=mocked_f2)
        def test_case(self):
            print some_module.f2()  # will print: 'Hey'
    

    在这种情况下,每次您在代码中调用f2(),都会调用mocked_f2

    【讨论】:

    • 如果我想测试f1()怎么办?
    • 它会模拟所有的 f2() 调用,即使你是通过 f1() 方法进行的
    • 请考虑编辑您的帖子,以添加更多关于您的代码的作用以及它为何能解决问题的说明。一个大部分只包含代码的答案(即使它正在工作)通常不会帮助 OP 理解他们的问题。
    • 我认为代码不需要任何解释
    【解决方案2】:

    django 提供了一些用于测试的脚手架 - 请参阅 docs

    至于f2() - 您可以使用fixtures 设置数据库。或者使用mock 提供一个虚拟数据库连接。

    【讨论】:

    • f2() 只是将一些数据写入数据库。我希望它在 f1 中完全模拟。我该如何做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2015-07-09
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    相关资源
    最近更新 更多