因此,我使用 smtplib 编写了一个简单的电子邮件服务,以便在用户首次登录时发送欢迎电子邮件。我想知道测试我的代码的最佳方法是什么。
def send_email(nickname, email):
msg = MIMEMultipart('alternative')
config = read_config_file(MAIL_CONFIG_PATH)
sen = config.get('gmail_credentials', 'email')
pwd = config.get('gmail_credentials', 'password')
server = None
try:
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login(sen, pwd)
server.sendmail(sen, [email], msg.as_string())
return 'Sent!'
finally:
if server:
server.quit()
我发现你可以使用假的 smtp 服务器:
sudo python -m smtpd -n -c DebuggingServer localhost:25
但是我仍然不确定我应该如何在我的代码中实现这样的东西。如何更改我的 API 以便它在测试期间运行 SMTP 服务器并连接到 GMAIL 服务器以进行实际调用?是否有初始化脚本可以在我们的服务器上运行 SMTP 服务器(这将部署在 AWS EC2 上)。
请您参考如下方法:
对于遇到同样问题的这张旧票的任何人,我想用标准库编写集成测试,所以上面的解决方案对我不起作用。在单元测试代码中本地设置调试服务器也有点棘手,据说不支持 starttls。最后我选择了这个;
import smtplib
from unittest import TestCase
class TestSMTP(TestCase)
...
setup etc.
def test_smtp_connection(self):
# connect to actual host on actual port
smtp = smtp.SMTP(host, port)
smtp.starttls()
# check we have an open socket
self.assertIsNotNone(smtp.sock)
# run a no-operation, which is basically a server-side pass-through
self.assertEqual(smtp.noop(), (250, '2.0.0 OK'))
# assert disconnected
self.assertEqual(smtp.quit(), (221, '2.0.0 Service closing transmission channel'))
self.assertIsNone(smtp.sock)
请注意,这些是集成测试,您需要做的就是验证您的电子邮件服务器是否正常工作。其他一切都可以通过模拟 smtp.SMTP 并捕获传递到 sendmail 的任何内容并验证那里的内容来完成。您不是在对 smtp 进行单元测试,而是在对您的应用程序进行单元测试。
