0

我想模拟一种方法以在我的一个模拟类中返回测试值。我遇到的问题是返回测试值,模拟方法返回一个 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()

测试(模拟.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'
4

1 回答 1

2

你被你的链式作业弄糊涂了:

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

该分配同时绑定provider_mocksut.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对象。

分开作业:

sut.get_provider = MagicMock(name='get_provider')
sut.get_provider.return_value = provider_mock
于 2014-07-14T18:37:23.510 回答