我有以下代码。文件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参数或多于1个参数调用foo(),为什么它不会标记错误?
答案 0 :(得分:0)
因为mock_foo
!= Foo.foo
。
mock_foo
是Foo.foo
的完全不同的实现。当你嘲笑它时,你正在定义应该做什么。由于mock_foo
除了任何参数(你已将其设置为返回一个字符串)之外没有设置,因此解释器不会抱怨缺少的参数。
Isn的模拟测试应该只是为了加速函数执行吗?
这句话并不完全正确。以下是模拟的简单用例:
def bar():
return rand.randint(0, 10)
def foo(num):
random = bar()
return num / random
我想测试foo
,但输出取决于bar
的输出。如果bar()
返回1,那么输出会是什么?还是10?还是0?要测试foo
是否正确,我可以模拟bar()
以返回预定义值,因此我知道对foo()
的期望。
我希望这是有道理的。