模拟不检查功能参数

时间:2017-12-02 22:02:19

标签: python function unit-testing mocking arguments

我有以下代码。文件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(),为什么它不会标记错误?

1 个答案:

答案 0 :(得分:0)

因为mock_foo!= Foo.foo

mock_fooFoo.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()的期望。

我希望这是有道理的。