Python mock: как смоделировать вызываемый класс из тестируемого метода класса - PullRequest
0 голосов
/ 21 октября 2019

Допустим, у меня есть следующий код:

bm.py    

from a.b import AC
class B:
    def __init__(self, **kwargs):
         self.blah = kwargs["blah"]
    def foo(self, message):
         # Do something here and then finally use AC().send()
         AC().send(message)

Я пишу приведенный ниже тестовый пример для вышеприведенного:

import pytest
import unittest
from mock import patch
from a.b import AC
import B

class TestB(unittest.TestCase):
    @patch('AC.send')
    def test_foo(self, mock_send):
         s = B(blah="base")
         s.foo("Hi!")
         ## What to assert here???

Я хотел бы высмеять AC.send. AC.send ничего не возвращает, потому что «отправляет» какой-либо внешней службе / машине. А также B.foo () тоже ничего не возвращает. Так что я не уверен, что мне следует утверждать и проверять?

С помощью приведенного выше контрольного примера я получаю следующую ошибку:

ModuleNotFoundError: No module named 'AC'

Я новичок в модульных тестовых случаях и насмешках.

Ответы [ 3 ]

1 голос
/ 21 октября 2019

относительно

ModuleNotFoundError: No module named 'AC'

Вы должны использовать полное запрошенное имя в @patch - в вашем случае @ patch ('abAC.send')

относительно

## What to assert here??? 

Этот вопрос слишком широкий и зависит от приложения. Как правило, вы должны спросить себя, что ожидается от производственного кода. Иногда вам нужно только проверить, что исключений нет. В этом случае вам не нужно ничего утверждать. Если будет исключение, тест не пройден.

Предложить прочитать этот прекрасный пост this

0 голосов
/ 21 октября 2019

На основании того, что @Florian Bernard упомянул в разделе комментариев, ниже работает!

import pytest
import unittest
from mock import patch
from a.b import AC
import B

class TestB(unittest.TestCase):
     @patch('a.b.AC.send') ##Provide the full import
     def test_foo(self, mock_send):
         s = B(blah="base")
         s.foo("Hi!")
0 голосов
/ 21 октября 2019

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

@patch('a.b.AC.send')
...