简体   繁体   English

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

[英]mocking a return of class object method in python

I would like to mock a method to return a test value in one of my mocked classes. 我想模拟一种方法来在我的一个模拟类中返回测试值。 The issue I am running into is rather then returning the test value, the mocked method returns an object of type MagicMock. 我遇到的问题是返回测试值,而模拟方法返回的是MagicMock类型的对象。

The code is pretty contrived but illustrates the issue. 该代码是人为设计的,但可以说明问题。

SuT (sut.py): 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()

Test (mocking.py): 测试(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'

You got confused by your chained assignment: 您对链式作业感到困惑:

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

That assignment binds provider_mock to both sut.get_provider and to MagicMock(name='get_provider').return_value . 该分配将provider_mock绑定到sut.get_provider MagicMock(name='get_provider').return_value

In other words, it essentially does this: 换句话说,它实际上是这样做的:

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

That's not what you wanted. 那不是你想要的。 Now sut.get_provider calls provider_mock and returns a new MagicMock object, not the original provider_mock object. 现在, sut.get_provider调用provider_mock并返回一个新的MagicMock对象,而不是原始的provider_mock对象。

Separate the assignments: 分开分配:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM