在python中模拟返回类对象方法

时间:2014-07-14 18:31:58

标签: python python-unittest python-mock

我想模拟一个方法来在我的一个模拟类中返回一个测试值。我遇到的问题是返回测试值,而mocked方法返回一个MagicMock类型的对象。

代码非常人为,但说明了问题。

SuT(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 个答案:

答案 0 :(得分:2)

您对链式任务感到困惑:

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

该作业将provider_mock 绑定到sut.get_provider

换句话说,它基本上是这样做的:

MagicMock(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