如何检查是否用预期的对象调用了方法

时间:2020-07-09 06:32:21

标签: python pytest pytest-mock

如何在pytest-mock中测试是否已用相应的对象调用方法?

我的对象如下:

class Obj:

    def __init__(self):
        self.__param = []
        self.__test = []

    @property
    def param(self):
        return self.__param

    @param.setter
    def param(self, value):
        self.__param = value
    
    # both methods: getter and setter are also available for the self.__test     


    # This is just a dummy test object
class Test:
      
    def call_method(self, text:str):
        obj = Obj()
        obj.param = [("test", "1"), ("test2", "2")]
        self.test_call(text, obj)

    def test_call(self, text:str, object: Obj):
        pass

我的测试如下:

def test_method(mocker):
    mock_call = mocker.patch.object(Test, "test_call")

    test = Test()
    test.call_method("text")

    expected_obj = Obj()
    expected_obj.param = [("test", "1"), ("test2", "2")]

    mock_call.assert_called_once_with("text", expected_obj)

此刻我收到错误消息:

assert ('text...7fbe9b2ae4e0>) == ('text...7fbe9b2b5470>)

似乎pytest检查两个对象的地址是否相同。我只想检查两个对象是否具有相同的参数。我该如何检查?

1 个答案:

答案 0 :(得分:1)

如果您不想检查对象身份,则不能使用assert_called_with-而是必须直接检查参数:

def test_method(mocker):
    mock_call = mocker.patch.object(Test, "test_call")

    test = Test()
    test.call_method("text")

    mock_call.assert_called_once()
    assert len(mock_call.call_args[0]) == 2
    assert mock_call.call_args[0][0] == "text"
    assert mock_call.call_args[0][1].param == [("test", "1"), ("test2", "2")]

例如您必须单独检查它是否被调用过一次,并且参数具有正确的属性。

请注意,call_argslist of tuples,其中第一个元素包含所有位置参数,第二个元素包含关键字参数,因此必须使用[0][0]和{{1} }索引以解决这两个位置参数。