2016-11-09 97 views
0

我有一个测试文件tests.py。目前,以帮助隔离问题,该文件只包含以下行:无法使用pytest在测试中导入模拟

from mock import Mock 

当我尝试运行此文件,pytest

$ py.test tests.py 

我碰到下面的错误输出:

tests.py:1: in <module> 
    from mock import Mock 
E ImportError: No module named mock 
=========================== 1 error in 0.00 seconds ============================ 

如果我运行python文件:

$ python tests.py 

我没有得到这个错误。同样,如果我打开一个交互式口译员,我可以毫无问题地导入mock为什么我在这种情况下无法访问mock

+0

你检查你的PATH变量,也许你有另一个Python二进制跑步? –

+1

谢谢@MichaelKarotsieris,让我走上正轨。我在virtualenv中,但pytest是通过我的操作系统包管理器(Ubuntu上的'apt')安装的。当我运行'py.test'命令时,我的虚拟环境在* sys.path中不是*,而是'mock'的安装位置。我必须删除通过'apt'安装的pytest版本,并通过'pip'将其安装在我的virtualenv中,以便它能够正常工作... – elethan

+0

cool!很高兴帮助! :) –

回答

0

原来,我是用通过apt安装,而我的mock版本在虚拟环境中通过pip安装Pytest的版本。对@MichaelKarotsieris的建议,我Pytest运行我的测试之后检查的sys.path的内容(我用的--pdb选项弹出到pdb调试器引发的错误之后):

$ py.test tests.py --pdb 
... 
(Pdb) import sys 
(Pdb) sys.path 

从此我发现虽然我的虚拟环境是活跃的,但是这个环境是而不是sys.path

接下来,我试图在我的虚拟环境中通过PIP安装pytest:

(my_env) $ pip install pytest 

然而,这一步单独通过apt安装Pytest的版本仍在使用,所以我决定只是将其删除:

(my_env) $ sudo apt remove --purge python-pytest 

之后,运行py.test命令按预期工作。

现在回想起来,我想我可以一直保持通过apt安装Pytest的版本,刚跑直接从virtualenv中的可执行文件:

(my_env) $ /path/to/my_env/bin/py.test tests.py