Assert_called_once_with necessário verificar se os casos em que a chamada está com a mesma informação

0

Pergunta

Eu estou tentando usar o assert_called_once_with de unittest.simulação https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.assert_called_once_with

Mas eu quero que a seleção se 2 instâncias de objetos que foram passados com a te atributos corretos.

Assim, dentro da classe I overrided o __eq__ func:

    def __eq__(self, other):
        return (
            self.id == other.id
            and self.users == other.users
        )

E o código que eu usei como este

        mock_add_user.assert_called_once_with(context_fix, expected_user_obj1, expected_user_obj2, users)

Mas eu recebo um erro e o teste continua comparando o repr da instância, como este

<app.domain.model.load_md.Load object at 0x10cb7d7d0>
E           AssertionError: Expected call: add_user(<app.infrastructure.context.Context object at 0x10cb7da50>, <app.domain.model.load_md.Load object at 0x10cb7d7d0>, <app.domain.model.load_md.Load object at 0x10cb7d550>, [1, 2, 3, 2])
E           Actual call: add_user(<app.infrastructure.context.Context object at 0x10cb7da50>, <app.domain.model.load_md.Load object at 0x10ca7f5d0>, <app.domain.model.load_md.Load object at 0x10cd1e650>, [1, 2, 3, 2])

Eu realmente preciso de uma maneira de afirmar se uma instância de um objeto tem de ser passado como um parâmetro da função com os atributos corretos preenchido.

mocking pytest python python-unittest
2021-11-23 20:31:11
1

Melhor resposta

0

Você deseja usar o call_args atributo do objeto de simulação:

from unittest.mock import ANY, Mock

class Foo:
    pass

def call(add_user):
    f = Foo()
    add_user(f)

def test_is_instance():
    mock_add_user = Mock()

    call(mock_add_user)

    # expected = Foo()
    # mock_add_user.assert_called_once_with(expected) # This would fail
    mock_add_user.assert_called_once_with(ANY)
    assert isinstance(mock_add_user.call_args.args[0], Foo)

Aqui é um pouco mais complexa exemplo com args e kwargs afirmações:

from unittest.mock import ANY, Mock

class Foo:
    pass

class Bar:
    pass

def call(add_user):
    f = Foo()
    b = Bar()
    add_user(f, bar=b)

def test_is_instance():
    mock_add_user = Mock()

    call(mock_add_user)

    mock_add_user.assert_called_once_with(ANY, bar=ANY)
    assert isinstance(mock_add_user.call_args.args[0], Foo)
    assert isinstance(mock_add_user.call_args.kwargs["bar"], Bar)
2021-11-26 15:33:54

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................