gpt4 book ai didi

python - 了解模拟和副作用

转载 作者:行者123 更新时间:2023-12-01 05:21:15 24 4
gpt4 key购买 nike

我是 Python 新手,我了解测试,但是,我无法专注于使用模拟对象和副作用。

这是我的方法:

@retry(every=RETRY_EVERY, until=RETRY_UNTIL)
@unique()
@sessionized(0)
def record_click(session, queue, mailing_id, member_id, link_id, timestamp, user_agent):
message = session.query(Message).get((mailing_id, member_id))
mailing = session.query(Mailing).get(mailing_id)
# More code here

这是我的测试:

@mock.patch("audience.jobs.EventProvider")
@mock.patch("audience.jobs.enqueue_webhook")
@mock.patch("logging.exception")
@mock.patch("audience.jobs.audience_queues")
@mock.patch("audience.jobs.Session")
@mock.patch("audience.jobs.DatabaseConnector")
def test_track_click_publishes_event_to_sns(self, DatabaseConnector, Session, audience_queues, logger, enqueue_webhook, EventProvider):
message_mock = mock.Mock(account_id=77)
message_mock.record_open.return_value = True
mailing_mock = mock.Mock(mailing_id=123)
mailing_mock.recipient_groups.return_value = [111]
session_query = Session.return_value.query.return_value
session_query.side_effect = lambda arg: message_mock if isinstance(arg, tuple) else mailing_mock

result = jobs.record_click(
888,
9999,
2048,
datetime.datetime(1999, 12, 31, 23, 59, 59, 999999).isoformat(),
"Mozilla/5.0")

self.assertIsNone(result)
self.assertListEqual(EventProvider.mock_calls, [
mock.call(),
mock.call().publish_link_clicked(
headers={'User-Agent': 'Mozilla/5.0'},
mailing_id=888,
account_id=77,
contact_id=9999,
link_id=2048,
group_ids=[111]
)
])
self.assertListEqual(logger.mock_calls, [])

我不断收到的错误是:

而不是
call().publish_link_clicked(group_ids=[111], account_id=77, **etc)

这就是单元测试中所说的
call().publish_link_clicked(group_ids=<MagicMock name='Session().query().get().recipient_groups' id='4557662736'>, account_id=<MagicMock name='Session().query().get().account_id' id='4557652048'>, **etc)

我做错了什么?

最佳答案

不要调用Session()query();使用Mock.return_value attribute而不是遍历调用图:

Session.return_value.query.return_value.side_effect = lambda arg: message_mock if isinstance(arg, tuple) else mailing_mock

我通常使用中间名称来保存返回值:

session_query = Session.return_value.query.return_value
session_query.side_effect = lambda arg: message_mock if isinstance(arg, tuple) else mailing_mock

您还需要修补正确的Session类;这完全取决于您的代码如何为 record_click 生成 session 参数。请参阅Where to Patch更多细节。如果 @sessionized 装饰器生成此参数,并且它存在于 audience.jobs 模块中,则您没有修补正确的位置.

关于python - 了解模拟和副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22302520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com