簡體   English   中英

Python 2.7 中的模擬導入

[英]mock import in Python 2.7

我有一個格式的導入:

from a.b.c.d import x

在 foo.py 中。 我正在測試 bla.py,它不直接導入 foo.py,而是在其方法之一中間接導入。 就像是:

bla.m1() --> bla2.m2() --> foo.m3()

在我的測試環境中,包“a”不可用,我想模擬它,以便在測試期間導入不會失敗。 根據How to mock an import ,我可以使用:

import sys
from unittest.mock import Mock
sys.modules['a.b.c.d'] = Mock()

如果我使用 Python 3,導入在測試代碼中工作,但是當我使用 Python 2.7(和外部模擬庫)時它會失敗。 為什么? 我怎樣才能讓它在 Python 2.7 中工作?

對於 Python 2.7,您需要將模擬模塊的每個級別顯式創建為“真實”的東西——因為 python 檢查對象是否存在(即使它實際上沒有對它做任何事情。

最簡單的選擇是也讓它們Mock方法,以防你想測試它們:

import sys
from mock import Mock

sys.modules['a'] = Mock()
sys.modules['a.b'] = Mock()
sys.modules['a.b.c'] = Mock()

from a.b.c import d
print(d)

<Mock name='mock.d' id='140035843407120'>

但是,以下內容也完全有效:

import sys
from mock import Mock

sys.modules['a'] = 'cat'
sys.modules['a.b'] = 1
sys.modules['a.b.c'] = Mock()

from a.b.c import d
print(d)

<Mock name='mock.d' id='1402443407120'>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM