python - 扭曲的 deferToThread,不适用于 Mock.patch()

标签 python twisted

我有 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/

相关文章:

python - 用于 Python/Django 的更简单的 i18n

python - 扭曲、延迟的请求以及文件与错误页面

Python - while 循环位于扭曲的主循环中?

python - 如何从 Twisted 中延迟 Django DB 操作?

python 扭曲代理超时

Python扭曲的defer和getProcessOutputAndValue问题

python - Microsoft Python 语言服务器无法识别 `for` 循环 `zip()`

python - 处理 csv 文件中不同格式的时间戳

python - Django channel [多聊天示例] : how do I set up admin to enable adding user(s) to a room?

Python多处理大量数据