2017-12-02 236 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