[英]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.