如何模拟一个类,以便它不会在导入时运行

时间:2016-11-28 22:43:17

标签: python mocking pytest

我有以下文件:

test_temp.py

import pytest
from mock import patch

with patch('temp.TheEvilClass'), patch('temp2.TheEvilClass'):
    from temp import TempClass


def test_evil():
    assert True

temp.py

from temp2 import TheEvilClass

class TempClass(object):
    TheEvilClass()

temp2.py

class TheEvilClass(object):
    print "I'm evil! ]:>"
    raise Exception

我的目的是让test_temp.py中的补丁模仿TheEvilClass,以便永远不会调用异常。我尝试在两个地方修补它,但异常仍然被抛出。你有没有指出我做错了什么以及如何测试temp.py而没有触发实际的TheEvilClass?我尝试模拟整个模块(使用patch('temp2')),但这似乎也不起作用。

1 个答案:

答案 0 :(得分:1)

mock无法实现您尝试做的事情,因为补丁本身会触发导入。 patch使用调用_get_target的{​​{1}}来调用_importer

https://github.com/testing-cabal/mock/blob/master/mock/mock.py#L1206

更简单的方法是直接应用补丁:

__import__

正确的方法是设置测试环境,以便在导入时不会引发未处理的异常。