#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)