【问题标题】:Mock does not check for function parametersMock 不检查函数参数
【发布时间】:2017-12-02 22:02:19
【问题描述】:

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

【问题讨论】:

    标签: python function unit-testing mocking arguments


    【解决方案1】:

    因为mock_foo != Foo.foo

    mock_fooFoo.foo 的完全不同的实现。当您嘲笑它时,您正在定义应该做什么。由于mock_foo 没有设置为除了任何参数(您已将其设置为返回一个字符串),因此解释器不会抱怨缺少参数。

    模拟测试不应该只是为了加速函数执行吗?

    这种说法并不完全正确。下面是一个简单的 mocking 用例:

    def bar():
       return rand.randint(0, 10)
    
    def foo(num):
       random = bar()
       return num / random
    

    我想测试foo,但输出取决于bar 的输出。如果bar() 返回 1,输出会是什么?还是10?还是0?为了测试foo 是否正确,我可以模拟bar() 以返回一个预定义的值,所以我知道foo() 有什么期望。

    我希望这是有道理的。

    【讨论】:

    • 谢谢。如何设置它以接受与它应该模拟的函数相同数量的参数?
    猜你喜欢
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2011-11-24
    • 2021-12-09
    • 2013-02-18
    相关资源
    最近更新 更多