【问题标题】:using simple unittest mock to patch an SMTP call使用简单的 unittest 模拟来修补 SMTP 调用
【发布时间】:2023-03-28 06:51:01
【问题描述】:

我只是在学习 unittest Mocks 并试图了解为什么修补对“smtplib.SMTP”的调用不会返回在模拟对象上设置的值。我认为不是,因为断言失败了。

我对发送电子邮件的函数有一个简单的定义:

def send(sender, to, subject="None", body="None", server="localhost"):
    message = email.message.Message()
    message['To'] = to
    message['From'] = sender
    message['Subject'] = subject
    message.set_payload(body)

    server = smtplib.SMTP(server)
    try:
        server.sendmail(sender, to, message.as_string())
    finally:
        server.quit()

我有一个包含简单测试函数的单元测试文件:

def test_send():
    with patch('smtplib.SMTP') as mock:
        instance = mock.return_value
        instance.sendmail.return_value = {}
        res = send('x@gmail.com', 'y@gmail.com', 'subject', 'body')
        assert res == {}

据我了解,当调用 'smtplib.SMTP' 的 sendmail 时,该调用应由 mock 修补,并应返回一个空字典。所以 res 变量应该设置为 {}。

对文件执行 pytest 时,断言总是失败:

 assert None == {}

我有两个问题:

  1. 我对单元测试的定义有问题吗?
  2. 什么是调试此类问题的好方法。我尝试使用 --trace 选项运行 pytest,但在单步执行代码时无法捕捉到“修补”时刻。

【问题讨论】:

  • 你能分享你的文件树吗?
  • patch 需要根据您要修补的上下文来指定要修补的东西send 是在与test_send 相同的文件中定义的,还是在另一个文件/模块中定义的?
  • send 在导入到测试模块的不同模块中定义。我不认为这是一个问题,因为在与测试它们的模块不同的模块中定义函数是正常的。
  • 能否请您在代码 sn-p 中添加模拟的导入语句,以便更好地理解模块。谢谢

标签: python mocking pytest python-unittest


【解决方案1】:

这里:

res = send('x@gmail.com', 'y@gmail.com', 'subject', 'body')
assert res == {}

您期望send 会返回一个值,并且应该是{} 的模拟值。但是,您将实现定义为不返回任何内容

def send(sender, to, subject="None", body="None", server="localhost"):
    ...
    try:
        server.sendmail(sender, to, message.as_string())
    ...
    # Doesn't return anything

如果您想查看模拟值,那么您应该响应返回到 sendmail 的调用。

def send(sender, to, subject="None", body="None", server="localhost"):
    ...
    response = None
    try:
        response = server.sendmail(sender, to, message.as_string())
    ....
    return response

运行后我这边测试成功了。

【讨论】:

  • 你是对的,因为我没有从send 返回任何东西,它会是无。谢谢
  • 很高兴它对您有所帮助。如果这是您需要的全部答案,您可能希望接受它作为答案:) stackoverflow.com/help/someone-answers
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多