Python, не может утверждать, если метод вызывается из другого класса

#python #mocking #patch #assert

#python #издевательство #исправление #утверждать

Вопрос:

У меня есть следующий код на Python:

 class A():
    def doSomething(self, bClass):
        print(bClass.theThing)

class B():
    def __init__(self, theThing):
        self.theThing = theThing

def foo():
    a = A()
    b = B("that thing")
    a.doSomething(b)
 

У меня есть эти классы и функция foo(), сохраненные в тестировании.py и я хочу проверить, что метод A был вызван с:

 import testing, unittest
from unittest.mock import patch

class TheTestClass(unittest.TestCase):
    def test(self):
            with patch('testing.A.doSomething') as do:
                testing.foo()
                do.assert_any_call()
 

Но я всегда получаю «Вызов doSomething () не найден». Я был бы счастливее, если бы мог понять почему, но на данный момент все приветствуется

Комментарии:

1. что произойдет, если вы создадите пустой файл с именем __init__.py в том же каталоге? Чтобы понять, как работают пакеты пространства имен и импорт, ознакомьтесь с документацией

2. Помогло ли это с твоей проблемой, Джордж? Если это так, я могу добавить подробный ответ, чтобы помочь другим, которые могут читать это в поисках решения.

3. Нет, я все еще не могу понять, почему это происходит

4. assert_any_call() пытается проанализировать testing.A.doSomething , однако аргумент не был включен, как doSomething ожидается bClass . Возможно, вы хотели использовать assert_called_with(<insert a class>)?

5. Это то, что я сделал изначально, но это не удалось так же, как «вызов не найден». Должен ли я имитировать класс B и использовать его в качестве аргумента в assert_called_with() ?

Ответ №1:

После многих часов я начал разбираться в этом. Как сказал assert_called_with() jwjhdev, ожидает чего-то, а в моем случае — класса, но так assert_any_call() и есть. По какой-то причине я думал assert_any_call() , что это просто сработает, но я думал assert_called() , что это просто работает без аргументов. В конце я понял это, добавив a return b к foo() функции и:

 def foo():
    a = A()
    b = B("that thing")
    a.doSomething(b)
    return b
 
 class TheTestClass(unittest.TestCase):
    def test(self):
            with patch('testing.A.doSomething') as do:
                b = testing.foo()
                do.assert_any_call(b)