魔术模拟assert_called_once vs assert_called_once_with怪异的行为



我注意到python中的 assert_called_onceassert_called_once_with的怪异行为。这是我真正的简单测试:

文件模块/a.py

from .b import B
class A(object):
    def __init__(self):
        self.b = B("hi")
    def call_b_hello(self):
        print(self.b.hello())

文件模块/b.py

class B(object):
    def __init__(self, string):
        print("created B")
        self.string = string;
    def hello(self):
        return self.string

这些是我的测试:

import unittest
from mock import patch
from module.a import A    
class MCVETests(unittest.TestCase):
    @patch('module.a.B')   
    def testAcallBwithMockPassCorrect(self, b1):
        a = A()
        b1.assert_called_once_with("hi")
        a.call_b_hello()
        a.b.hello.assert_called_once()
    @patch('module.a.B')
    def testAcallBwithMockPassCorrectWith(self, b1):
        a = A()
        b1.assert_called_once_with("hi")
        a.call_b_hello()
        a.b.hello.assert_called_once_with()
    @patch('module.a.B')
    def testAcallBwithMockFailCorrectWith(self, b1):
        a = A()
        b1.assert_called_once_with("hi")
        a.b.hello.assert_called_once_with()
    @patch('module.a.B')
    def testAcallBwithMockPassWrong(self, b1):
        a = A()
        b1.assert_called_once_with("hi")
        a.b.hello.assert_called_once()
if __name__ == '__main__':
    unittest.main()

我以该功能的名义说明的问题是:

  • 测试1正确通过
  • 测试2正确通过
  • 测试3正确失败(我已经删除了b)
  • 测试4通过我不确定为什么。

我做错了什么吗?我不确定,但是阅读文档文档Python:

assert_called_once(*args,** kwargs)

断言该模拟被完全调用一次。

这是旧的,但是对于其他降落在这里的其他人...

for Python<3.6,assert_called_once不是一回事,因此您实际上是在做一个模拟的功能调用,该函数调用不会错误

请参阅:http://engineroom.trackmaven.com/blog/mocking-mistakes/

您可以改为检查呼叫计数。

相关内容

  • 没有找到相关文章

最新更新