Объект Pytest, созданный объектом assert_called_once_with - PullRequest
0 голосов
/ 20 апреля 2020

Я знал, как я могу проверить, был ли вызванный объект вызван с указанным аргументом c. Но в моем случае внедренный объект создаст объект, этот объект создаст другой объект, и я хочу проверить, был ли последний объект вызван с правильным аргументом.

в приведенном ниже примере вопрос был бы, если c .dirve был вызван с аргументом 100:

class car:
    def drive(self, distance):
        print("so fast")


class car_shop:
    def buy_car(self):
        return car()


class shop_shop:
    def buy_shop(self):
        return car_shop()


class processor:
    def __init__(self, sshop):
        self.sshop = sshop


    def run(self):
        cshop = self.sshop.buy_shop()
        c = cshop.buy_car()
        c.drive(100)


def main():
    sshop = shop_shop()
    proc = processor(sshop)
    proc.run()


if __name__ == "__main__":
    main()

есть ли способ проверить это?

Так как здесь был запрошен мой подход для тестирования этих объектов:

import pytest
from unittest.mock import Mock

from object_returns_object_test_for_arguments import processor, shop_shop

@pytest.fixture
def mock_shop_shop():
    return Mock(spec=shop_shop)

def test_processor_car_called_with_100(mock_shop_shop):
   proc = processor(mock_shop_shop)
   proc.run()
   assert mock_shop_shop.car_shop.car.drive.assert_called_once_with(100)
   assert mock_shop_shop.car_shop.car.drive.call_count == 1

1 Ответ

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

Если вы используете только код, указанный в вопросе, вам нужно только смоделировать car.drive. Это можно сделать, например, следующим образом:

from unittest import mock

from object_returns_object_test_for_arguments import processor, shop_shop


@mock.patch('object_returns_object_test_for_arguments.car.drive')
def test_processor_car_called_with_100(drive_mock):
    proc = processor(shop_shop())
    proc.run()
    drive_mock.assert_called_once_with(100)

Поскольку я не знаю ваш реальный код, вам, возможно, придется высмеивать больше вещей.
В качестве отступления: имена классов в Python по умолчанию написан в верхнем регистре, в стиле верблюжьего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...