Проверьте экземпляр метода Mocked, вызываемого один раз - PullRequest
0 голосов
/ 01 апреля 2020

Моя функция ищет объект Actor в базе данных и вызывает его метод do_something() с переданным аргументом.

from my_app.models import Actor

def my_function(id, stuff):
    actor = Actor.objects.get(id=id)
    return actor.do_something(stuff)

Я хочу, чтобы мой модульный тест проверил две вещи:
1 . my_function находит Actor Я хочу.
2. my_function вызывает метод актера do_something, как и ожидалось.

from unittest import mock
from django.test import TestCase
from my_app.models import Actor
from my_app.views import my_function


class ViewsTestCase(TestCase):

    @classmethod
    def setUpTestData(cls):
        self.actor = Actor.objects.create(id=42, name='John')

    def test_my_function(self):
        with mock.patch.object(Actor, 'do_something') as mock_do:
            my_function(id=42, stuff='a-short-string')
            mock_do.assert_called_once_with('a-short-string')

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

1 Ответ

0 голосов
/ 01 апреля 2020

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

При добавлении autospec=True к вашему ложному утверждению сам параметр self станет доступен в смоделированном объекте call_args. Чтобы быть более понятным, ваш тестовый пример будет выглядеть примерно так:

from unittest import mock
from django.test import TestCase
from my_app.models import Actor
from my_app.views import my_function


class ViewsTestCase(TestCase):

    @classmethod
    def setUpTestData(cls):
        self.actor = Actor.objects.create(id=42, name='John')

    def test_my_function(self):
        with mock.patch.object(Actor, 'do_something', autospec=True) as mock_do:
                                                      ^^^^^^^^^^^^^
            my_function(id=42, stuff='a-short-string')
            mock_do.assert_called_once_with(self.actor, 'a-short-string')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...