Как издеваться над инициалом вспомогательного класса - PullRequest
0 голосов
/ 30 ноября 2018

У меня проблемы с проверкой, строится ли объект с правильными параметрами из другого экземпляра объекта.В приведенном ниже примере я пытаюсь создать экземпляр B в экземпляре A.Я хочу проверить параметр, используемый в конструкторе B внутри экземпляра A.Когда я запускаю тест, приведенный ниже, я получаю:

AssertionError: assert None
[CPython36:setup:stdout] E        +  where None = <bound method NonCallableMock.assert_called_with of <MagicMock name='B' id='139968329210736'>>(4)
[CPython36:setup:stdout] E        +    where <bound method NonCallableMock.assert_called_with of <MagicMock name='B' id='139968329210736'>> = <MagicMock name='B' id='139968329210736'>.assert_called_with

Я не совсем уверен, что я делаю здесь неправильно, и просматривал другие сообщения о переполнении стека, но не смог решить мою проблему.

b.py:

class B(object):
    def __init__(self, x):
        self.x = x

    def square(self):
        return x * x

a.py:

from b import B

class A(object):
    def foo(self):
        b = B(4)
        b.square()

test_a.py:

import unittest
from unittest.mock import patch

from a import A

class TestA(unittest.TestCase):  

    @patch('a.B')
    def test_foo(self, mock_b):
        self.a = A()
        self.a.foo()
        assert mock_b.assert_called_with(4)

1 Ответ

0 голосов
/ 30 ноября 2018

Метод assert_called_with возвращает None, поэтому то, что вы делаете, похоже на выполнение

assert None

И это в основном сообщение об ошибке, которое вы получаете.

Вы можете просто использовать

mock_b.assert_called_with(4)

У которого есть внутреннее утверждение, и pytest отобразит его правильно в случае сбоя.Попробуйте проверить это, изменив значение аргумента.

В качестве альтернативы, если вы предпочитаете написать утверждение самостоятельно, вы можете сделать что-то вроде этого:

from unittest.mock import call
assert mock_b.call_args_list == [call(4)]

Или только последний вызов:

from unittest.mock import call
assert mock_b.call_args == call(4)
...