如何测试是否调用了Mock函数(pytest)

时间:2020-10-22 23:01:14

标签: python unit-testing pytest

有一个变量抽象类。每当值更改时,它都有一个_callbacks方法用于执行控制器类提供的功能。我要为此编写测试。

from unittest.mock import Mock


class Variable():

    def __init__(self, value=0):
        self.value = value
        self.callbacks = {}

    def add_callback(self, func):
        self.callbacks[func] = None

    def _callbacks(self):
        for func in self.callbacks:
            func(self.value)


def test_var_add_callback():
    func = Mock()
    var = Variable()
    var.add_callback(func)
    var._callbacks()
    assert func.assert_called()

使用pytest可以得到:

================================== FAILURES ===================================
____________________________ test_var_add_callback ____________________________

    def test_var_add_callback():
        func = Mock()
        var = Variable()
        var.add_callback(func)
        var._callbacks()
>       assert func.assert_called()
E       AssertionError: assert None
E        +  where None = <bound method NonCallableMock.assert_called of <Mock id='2389330693592'>>()
E        +    where <bound method NonCallableMock.assert_called of <Mock id='2389330693592'>> = <Mock id='2389330693592'>.assert_called

tests\test_stack.py:25: AssertionError
===================== 1 failed, 18 passed in 0.40 seconds =====================

我不明白为什么它不起作用。我读了这个Understanding the Python Mock Object Library #Assertions and Inspection,而且我很确定自己所做的事情与示例中的相同。而且,即使我手动调用None,断言也会返回func

def test_var_add_callback():
    func = Mock()
    var = Variable()
    var.add_callback(func)
    var._callbacks()
    func()
    assert func.assert_called()

请帮助我找到我想念的东西。

1 个答案:

答案 0 :(得分:1)

只需删除 assert 语句前的 func.assert_called() 关键字。

func.assert_called() 返回 Noneassert None 将引发 AssertionError