2017-12-02 235 views
0

我有下面的代碼。文件foo.py有:模擬的函數不檢查參數

#!/usr/bin/python3 

import time 
class Foo(): 
    def foo(self, num): 
    time.sleep (10) 
    return num + num 

文件mock_test.py有:

#!/usr/bin/python3 

from mock import patch 
import foo 
import unittest 

class FooTestCase(unittest.TestCase): 
    @patch('foo.Foo.foo') # filename, classname, fn name 
    def test_one(self, mock_foo): 
    mock_foo.return_value = 'mock return value' 
    myobj = foo.Foo() 
    print (myobj.foo()) 

if __name__ == '__main__': 
    unittest.main() 

和文件regular_test.py有:

#!/usr/bin/python3 

import foo 
import unittest 

class FooTestCase(unittest.TestCase): 
    def test_one(self): 
    f = foo.Foo() 
    print (f.foo(20)) 

if __name__ == '__main__': 
    unittest.main() 

現在,如果我跑regular_test.py,它檢查傳遞給f.foo()的參數的數量,但mock_test.py沒有這樣的事情!模擬測試是否應該僅用於加速函數執行?如果我用0個參數或多個參數調用foo(),爲什麼不標記錯誤?

回答

0

因爲mock_foo!= Foo.foo

mock_foo是一種完全不同的實施Foo.foo。當你嘲笑它時,你正在定義應該做什麼。由於mock_foo未設置爲除了任何參數(您已將其設置爲返回字符串),解釋器不會抱怨缺少的參數。

不是模擬測試應該只是爲了加速函數執行嗎?

這種說法並不完全正確。以下是嘲諷的一個簡單的例子:

def bar(): 
    return rand.randint(0, 10) 

def foo(num): 
    random = bar() 
    return num/random 

我想測試foo,但輸出取決於bar輸出。如果bar()返回1,輸出是多少?或10?或0?爲了測試是否foo是正確的,我可以模擬bar()返回預定值,所以我知道從foo()期望什麼。

我希望這是有道理的。

+0

感謝。我如何設置它接受與它應該模擬的函數相同數量的參數? – whirlaway