首页 > 解决方案 > 当我无权访问实例本身时,如何设置模拟类实例的 return_value?

问题描述

假设我有一些函数A.foo()实例化并使用 的实例B,并在其上调用成员函数bar

鉴于我无权访问 的实例,如何在我测试我的类时设置return_value一个模拟实例?也许一些代码会更好地说明这一点:BAB

import unittest
import unittest.mock
import pandas

class A:
    def foo(self):
        b = B()
        return b.bar()

class B:
    def bar():
        return 1

@unittest.mock.patch("__main__.B")
class MyTestCase(unittest.TestCase):
    def test_case_1(self, MockB):
        
        MockB.bar.return_value = 2
        
        a = A()
        
        self.assertEqual(a.foo(), 2)

test_case = MyTestCase()
test_case.test_case_1()

这失败了;

AssertionError: <MagicMock name='B().bar()' id='140542513129176'> != 2

显然该行MockB.bar.return_value = 2没有修改该方法的返回值。

标签: pythonmockingpython-unittest

解决方案


我认为您没有启动 MockB。您可以直接模拟“ main .B.bar”:

@unittest.mock.patch("__main__.B.bar")
class MyTestCase(unittest.TestCase):
    def test_case_1(self, MockB):
        
        MockB.return_value = 2
        
        a = A()
        
        self.assertEqual(a.foo(), 2)


推荐阅读