[英]Why this mocking script doesn't work (unittest, Mocker, python)
我想模擬使用以下腳本在MyClass.mymethod中調用的MyClass.toBeMockedMethod。 它運行時並沒有實際對其進行嘲笑。 不知道為什么。
class Test_mytest(MockerTestCase):
def mock_it_up(self, function, result=None, mmin=0, mmax=None):
function = self.m.mock()
function(ARGS)
self.m.result(result)
self.m.count(mmin, mmax)
def setUp(self):
self.m = Mocker()
self.mock_it_up(MyClass.toBeMockedMethod)
self.o=Myclass(0)
def test_one_atom(self):
self.o.mymethod()
def tearDown(self):
pass
if __name__ == '__main__':
main()
就像這個問題一樣 ,您真正想做的是修補 MyClass
實例。 如果MyClass
是新樣式的類,則可以執行以下操作:
class Test_mytest(MockerTestCase):
def mock_it_up(self, function, result = None, mmin = 0, mmax = None):
methodToMock = getattr(self.p, function)
methodToMock()
self.m.result(result)
self.m.count(mmin, mmax)
def setUp(self):
self.m = Mocker()
self.o = MyClass(0)
self.p = self.m.patch(self.o)
self.mock_it_up('toBeMockedMethod')
# Put more calls to mock_it_up here.
self.m.replay()
def test_one_atom(self):
self.o.mymethod()
這將修改self.o
以便對toBeMockedMethod
調用進行toBeMockedMethod
。
但是,如果MyClass
不是新型類,則修補將無法進行。 在這種情況下,您可以使用類型模擬來誘使MyClass
進行所需的操作。 例如:
class Test_mytest(MockerTestCase):
def mock_it_up(self, function, result = None, mmin = 0, mmax = None):
methodToMock = getattr(self.mockObj, function)
methodToMock()
self.m.result(result)
self.m.count(mmin, mmax)
def setUp(self):
self.m = Mocker()
self.o = MyClass(0)
self.mockObj = self.m.mock(MyClass)
self.mock_it_up('toBeMockedMethod')
# Put more calls to mock_it_up here.
self.m.replay()
def test_one_atom(self):
MyClass.mymethod(self.mockObj)
請注意,該mock
的mock
方法與要進行類型模擬的類一起調用。 后來,我們調用MyClass.mymethod(...)
而不是調用self.o.mymethod()
MyClass.mymethod(...)
。 現在, MyClass.mymethod()
期望將MyClass
的實例作為其第一個參數,但是幸運的是,模擬對象偽裝成MyClass
的實例,因此調用得以進行。 當mymethod()
調用toBeMockedMethod()
,它將實際上調用toBeMockedMethod()
方法,而不是實際方法。
我迅速修改了一個測試MyClass
如下所示:
class MyClass():
def __init__(self, x):
self.x = x
def toBeMockedMethod(self):
print "Not Mocked!"
def mymethod(self):
self.toBeMockedMethod()
當我將此代碼作為單元測試運行時,我得到了:
.
----------------------------------------------------------------------
Ran 1 test in 0.002s
OK
這是理想的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.