Исправление метода класса, который уже исправлен

#python #pytest #pytest-mock

Вопрос:

Я пытаюсь исправить класс и его метод, это пример того, что я пытаюсь сделать:

 class Car:
    def __init__(self, color):
        self.color = color

    def show_color(self):
        return self.color
 

У меня есть этот класс, и я хочу исправить класс и его метод отдельно, я не создавал поддельный класс, потому что в моем случае класс сложный, поэтому я хочу, чтобы класс был создан, а затем просто исправил метод, у которого есть класс, я пытаюсь это сделать:

 import example

def test_example(
    mocker
):
    mocker.patch("example.Car")
    mocker.patch("example.Car.show_color").return_value = "red"
    c = example.Car("blue")
    assert c.show_color() == "red"
 

Кроме того, я пытался сделать что-то вроде этого:

 import example

def test_example(
    mocker
):
    mocker.patch("example.Car").return_value = mocker.create_autospec(
        example.Car,
        show_color = "red"
    )
    c = example.Car("blue")
    assert c.show_color() == "red"
 

В двух случаях я получил эту ошибку:

 ========================================================================================== FAILURES ==========================================================================================
________________________________________________________________________________________ test_example ________________________________________________________________________________________

mocker = <pytest_mock.plugin.MockerFixture object at 0x102281bb0>

    def test_example(
        mocker
    ):
        mocker.patch("example.Car")
        mocker.patch("example.Car.show_color").return_value = "red"
        c = example.Car("blue")
>       assert c.show_color() == "red"
E       AssertionError: assert <MagicMock name='Car().show_color()' id='4331364896'> == 'red'
E           where <MagicMock name='Car().show_color()' id='4331364896'> = <MagicMock name='Car().show_color' id='4331344512'>()
E             where <MagicMock name='Car().show_color' id='4331344512'> = <MagicMock name='Car()' id='4331304944'>.show_color

test_mocking.py:21: AssertionError
================================================================================== short test summary info ===================================================================================
FAILED test_mocking.py::test_example - AssertionError: assert <MagicMock name='Car().show_color()' id='4331364896'> == 'red'
===================================================================================== 1 failed in 0.06s ======================================================================================
 

Я исправляю метод, потому что у меня есть другой метод из другого класса, который я хочу протестировать

Ответ №1:

mocker.patch сам по себе возвращает макет, с которым вы затем можете взаимодействовать:

 def test_example(mocker):
    Car = mocker.patch("example.Car")
    Car.return_value.show_color.return_value = "red"
    c = example.Car("blue")
    assert c.show_color() == "red"
 

Кроме того, патч принимает **кварги, которые вы можете использовать для настройки под-насмешек:

 def test_example_alternative(mocker):
    config = {"return_value.show_color.return_value": "red"}
    mocker.patch("example.Car", **config)
    c = example.Car("blue")
    assert c.show_color() == "red"
 

Ответ №2:

Ты залатываешь с:

 show_color = "red"
 

Но ваше утверждение пытается вызвать show_color, как если бы это была функция

 if c.show_color() == “red”:
 

что обречено на провал, может быть, вам стоит проверить:

 if c.show_color == “red”:
 

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

1. Нет, они исправляют show_color.return_value «красный»