在Python中模拟类对象方法的返回值
我想在我模拟的类中,让一个方法返回一个测试值。现在遇到的问题是,这个模拟的方法并没有返回我想要的测试值,而是返回了一个叫做 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_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