在Python中模拟类对象方法的返回值

0 投票
1 回答
3171 浏览
提问于 2025-04-18 13:17

我想在我模拟的类中,让一个方法返回一个测试值。现在遇到的问题是,这个模拟的方法并没有返回我想要的测试值,而是返回了一个叫做 MagicMock 的对象。

虽然代码有点复杂,但能说明问题所在。

被测试的代码 (sut.py):

provider = None


class Provider():
    def get_data(self):
        return 'production data'


def get_provider():
    return Provider()


def setup_provider():
    global provider
    provider = get_provider()


def do_worker():
    return provider.get_data()

测试代码 (mocking.py):

import unittest
from mock import MagicMock
import sut


class TestWorker(unittest.TestCase):
    def test_worker(self):
        provider_mock = MagicMock()
        provider_mock.get_data.return_value = 'test data'

        sut.get_provider = MagicMock(name='get_provider').return_value = provider_mock

        sut.setup_provider()

        data = sut.do_worker()

        # data comes back as type MagicMock
        assert data == 'test data'

1 个回答

2

你可能对你的连锁赋值感到困惑:

sut.get_provider = MagicMock(name='get_provider').return_value = provider_mock

这个赋值把 provider_mock 绑定到了 sut.get_providerMagicMock(name='get_provider').return_value 上。

换句话说,它实际上是这样做的:

sut.get_provider = provider_mock
MagicMock(name='get_provider').return_value = provider_mock

这不是你想要的结果。现在 sut.get_provider 调用的是 provider_mock,并返回一个新的 MagicMock 对象,而不是原来的 provider_mock 对象。

把赋值分开:

sut.get_provider = MagicMock(name='get_provider')
sut.get_provider.return_value = provider_mock

撰写回答