【问题标题】:Fake subfunction in django UnitTest Case (Mocking)django UnitTest Case 中的假子函数(模拟)
【发布时间】:2013-09-27 11:59:33
【问题描述】:
def func_b(**kwargs):
    return something


def func_a(request,*args,**kwargs):
    //do something
    b = func_b(**kwargs)
    //do something
    return something

我正在为 func_a 编写 UnitTest,但我想使用模拟或类似于 django 中的模拟的任何东西来伪造 func_b 的输出。 意味着我只想伪造func_b 的输出,并且总是想在测试用例中从func_b 返回一些静态值。 有什么办法吗?

【问题讨论】:

    标签: python django unit-testing testing mocking


    【解决方案1】:

    您应该使用mock.patch 并指定return_value。下面是一个示例,我们将func_b() 的返回值即时修补为Fake value

    from mock import patch
    import unittest
    
    
    def func_b():
        return "Real value"
    
    
    def func_a():
        return "The result of func_b is '%s'" % func_b()
    
    
    class MyTestCase(unittest.TestCase):
        def test_fake_value(self):
            with patch('test.func_b', return_value="Fake value") as mock_function:
                self.assertEqual(func_a(), "The result of func_b is 'Fake value'")
    

    更新:

    with patch.object(module_name, 'func_b') as mock_function:
        mock_function.return_value = "Fake value"
        self.assertEqual(func_a(), "The result of func_b is 'Fake value'")
    

    【讨论】:

    • 只有当我们的func_a和func_b在同一个文件时它才有效。当func_a和func_b在不同的文件时它不起作用。请指导我。
    • 我收到错误“未定义全局名称 mock_function”。
    • module_name 是写 'func_b' 的模块的名称,对吧?我问它是因为 UPD 部分不适合我。
    • @HarshitAgarwal 是的。应该管用。我已经使用这种技术很长时间了,这不是我猜的。 “不起作用”是什么意思?
    • UPD 部分仅在 func_b 是类的方法并且我们的 module_name 是该方法的类名时才有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    相关资源
    最近更新 更多