2016-11-28 28 views
1

我有以下文件運行:如何嘲笑的一類,因此不會對進口

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')),但這似乎也不工作。

+2

你不能,你在*導入後修補*。相反,你應該重新設計'temp2',以便在導入時不做任何事情。 – jonrsharpe

+1

我不同意@jonrsharpe,你可能不一定想改變代碼的工作方式,只是爲了測試目的。更有可能出現需要正確設置環境的情況,以便導入不會失敗。 – wim

+0

不幸的是,我不能對temp2做任何事情,因爲它是一個外部模塊。 – iknownothing

回答

1

你試圖做的事不可能與mock,因爲它是補丁本身觸發導入。 patch調用_get_target,其使用_importer,其調用__import__

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

更簡單的方法,看看通過直接應用補丁就是:

patch('temp.TheEvilClass').__enter__() 

正確的方式去了解這是建立測試環境,以便處理異常AREN」在進口時提高。

+0

這是如何直接應用修補程序的?無論如何,在調用補丁的__enter __()之後,我並沒有完全得到我所獲得的結果。通過「設置測試環境」,你的意思是壓制異常? – iknownothing

+2

我的意思是如果你使用補丁(直接調用'__enter__'或者使用'with'語句),那麼你將會看到異常,因爲*它是導入代碼*的補丁操作。如果你用'pass'代替'test_temp.py'裏的臨時導入TempClass',你就會明白我在描述什麼。你錯了,這是一個XY問題 - 正確的方法是設置一個測試環境,以便足夠好地模擬運行時環境,以便此代碼在導入時不會出錯。 – wim