测试函数是否被调用

时间:2016-07-13 22:03:43

标签: python-3.x pytest

我正在我的应用程序中编写测试,测试方法是否被调用。这是在Python 3.4.3和pytest-2.9.2中运行的。我是PyTest的新手,但对RSpec和Jasmine非常熟悉。我不确定如何设置测试,以便测试imaplib.IMAP4_SSL被调用。

我的应用结构:

/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是否被调用?或者有更好的方法在我的应用程序中设置测试套件,这样可以更有效地支持测试吗?

3 个答案:

答案 0 :(得分:2)

以下是使用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)

注意用模拟对象替换IMAP4_SSL的@mock.patch.object装饰器,它作为参数添加。 Mock是一个强大的测试工具,对于新用户来说可能会让人感到困惑。我建议以下内容进一步阅读:

https://www.toptal.com/python/an-introduction-to-mocking-in-python

http://engineroom.trackmaven.com/blog/mocking-mistakes/

http://alexmarandon.com/articles/python_mock_gotchas/

答案 1 :(得分:0)

你可以做的是:

email_handler.py

import imaplib

def email_conn(host):
    print("We are in email_conn()")
    mail = imaplib.IMAP4_SSL(host)
    print(mail)
    return mail;

test_email_handler.py

import sys   
sys.path.append('.')  

from shared import email_handler 

def test_email_handler():
    print("We are in test_email_handler()")
    email_handler.email_conn.imaplib.IMAP4_SSL.assert_called_once
    print(email_handler.email_conn.imaplib.IMAP4_SSL.assert_called_once) # this will give you the result of the function (in theory) 

基本上,你所做的就是打印函数返回的内容。如果没有错误,则应该执行该功能。

您还可以做的是修改imaplib的源代码,以便将打印件放入您正在调用的函数中。

祝你好运!

答案 2 :(得分:0)

这听起来像代码覆盖的问题:这条线是否被执行了?

对于python覆盖工具是:https://coverage.readthedocs.io

Pytest构建了基于该工具的插件,非常方便: https://pypi.python.org/pypi/pytest-cov