扭曲的延迟线程,不使用模拟补丁()

2024-10-06 12:23:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个函数都用@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在

^{pr2}$

但是当我跑步时:

$ 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()

在我们使用deferToThread()之前,save_to_db()似乎被正确地模拟了

(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()

还有更好的选择吗?如有任何提示,我们将不胜感激。非常感谢。在


Tags: topyobjdbdatasaveexceptioncontact
1条回答
网友
1楼 · 发布于 2024-10-06 12:23:15

我遇到了相同的问题;@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()

这对你有用吗?在

相关问题 更多 >