我正在我的应用程序中编写测试,测试方法是否被调用.这是在
Python 3.4.3和pytest-2.9.2中运行的.我是PyTest的新手,但对RSpec和Jasmine非常熟悉.我不确定如何设置测试,以便测试imaplib.IMAP4_SSL被调用.
我的app结构:
/myApp
__init__.py
/shared
__init__.py
email_handler.py
/tests
__init__.py
test_email_handler.py
email_handler.py
import imaplib
def email_conn(host):
mail = imaplib.IMAP4_SSL(host)
return mail;
到目前为止,我的测试结果如下:
test_email_handler.py
import sys
sys.path.append('.')
from shared import email_handler
def test_email_handler():
email_handler.email_conn.imaplib.IMAP4_SSL.assert_called_once
这显然失败了.如何设置此测试以便测试imaplib.IMAP4_SSL是否被调用?或者是否有更好的方法在我的应用程序中设置测试套件,这样可以更有效地支持测试?
最佳答案 以下是使用Python 3.5.2标准库中的unittest.mock的示例:
test_email_handler.py
import sys
from unittest import mock
sys.path.append('.')
from shared import email_handler
@mock.patch.object(email_handler.imaplib, 'IMAP4_SSL')
def test_email_handler(mock_IMAP4_SSL):
host = 'somefakehost'
email_handler.email_conn(host)
mock_IMAP4_SSL.assert_called_once_with(host)
请注意@ mock.patch.object装饰器,它将IMAP4_SSL替换为模拟对象,该对象作为参数添加. Mock是一个强大的测试工具,对于新用户来说可能会让人感到困惑.我建议以下内容进一步阅读:
https://www.toptal.com/python/an-introduction-to-mocking-in-python