【问题标题】:mocking a return of class object method in python在python中模拟类对象方法的返回
【发布时间】:2014-07-14 18:31:58
【问题描述】:

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

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

【问题讨论】:

    标签: python python-unittest python-mock


    【解决方案1】:

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

    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 对象。

    分开作业:

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

    【讨论】:

    • 非常感谢 - 你的权利,我遇到了一些问题 - 我花了很多时间在 c# 和 java 中使用模拟框架 - 仍然让我的思绪围绕着 python。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2022-12-03
    • 2023-01-03
    • 1970-01-01
    • 2011-01-02
    相关资源
    最近更新 更多