我有 2 个函数都用 @defer.inlineCallbacks
装饰器包装。
为了测试,我模拟了各种东西,包括 save_to_db()
函数。
逻辑.py
@defer.inlineCallbacks
def save_to_db(obj): # mocked for test.
raise Exception('Oh Noe!')
@defer.inlineCallbacks
def create_contact():
xero = yield get_xero_client()
data = {
# <contact info>
}
# Create a new contact
response = yield deferToThread(xero.contacts.put, data)
obj = {
# some data extracted from response
}
yield save_to_db(obj)
测试.py
import mock
from twisted.internet import defer
from twisted.trial import unittest
from .logic import create_contact
class TestContactCreation(unittest.TestCase):
@mock.patch('logic.save_to_db')
@mock.patch('logic.get_xero_client')
@defer.inlineCallbacks
def test_get_xero_client_is_called(self, mocked_xero_client, mocked_save_method):
yield create_contact()
mocked_get_xero_client.assert_called()
但是当我运行时:
$ trial tests.TestContactCreation
save_to_db()
实际被调用,并且如预期的那样引发异常。
Traceback (most recent call last):
File "<file_path>/logic.py", line 93, in save_to_db
raise Exception('Oh Noe!')
exceptions.Exception: Oh Noe!
我不确定为什么!我尝试使用 pdb
进行调试。
import pdb; pdb.set_trace()
看起来 save_to_db()
在我们使用 deferToThread()
之前被正确模拟了
(Pdb) save_to_db
<MagicMock name='save_to_db' id='4404276240'>
但是在我使用 deferToThread()
(Pdb) save_to_db
<function save_to_db at 0x111c6f488>
save_to_db()
不再被模拟!解决这个问题的唯一方法是我也模拟 deferToThread()
还有更好的选择吗?任何提示将不胜感激。非常感谢。
最佳答案
我遇到了同样的问题; @mock.patch(...)
装饰器在与 @inlineCallbacks
一起使用时不起作用(即,它实际上并不模拟所需的东西)装饰器。
对我有用的是通过上下文管理器进行模拟:
@defer.inlineCallbacks
def test_get_xero_client_is_called(self):
with mock.patch('logic.save_to_db') as mocked_save_method, \
mock.patch('logic.get_xero_client') as mocked_xero_client:
yield create_contact()
mocked_get_xero_client.assert_called()
这对你有用吗?
关于python - 扭曲的 deferToThread,不适用于 Mock.patch(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41495374/