0
考慮以下代碼:我如何自動模擬python 3默認爲None的模擬屬性?
import unittest
from unittest.mock import patch
class Foo(object):
def __init__(self, bar=None):
self.bar = bar
def methodA(self):
print("In methodA")
def methodB(self):
print("In methodB")
def my_func(bar):
foo = Foo(bar)
if foo.bar:
foo.methodA()
foo.methodB()
class MyTestCase(unittest.TestCase):
def test_my_func(self):
bar = None
with patch("__main__.Foo", autospec=True) as foo:
my_func(bar)
foo.methodB.assert_called_once_with()
if __name__ == '__main__':
unittest.main()
的想法是相當簡單的。我有一個函數,其行爲切換實例屬性的存在或不存在。我正在嘗試編寫一個單元測試,以驗證只執行某些Foo
方法,具體取決於屬性。
基於模擬庫的patch和autospeccing文檔,我想在patch()
上下文管理器設置autospec=True
就足夠了。它沒有。生成的Mock()
正確包括methodA
和methodB
嘲笑,但測試失敗,此錯誤:
======================================================================
ERROR: test_my_func (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "so.py", line 28, in test_my_func
my_func(bar)
File "trash.py", line 18, in my_func
if foo.bar:
File "/.../python3.3/unittest/mock.py", line 549, in __getattr__
raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'bar'
我敢肯定,我失去了一些東西很明顯,但我似乎無法找出什麼。我怎麼能單元測試my_func()
?我的問題