2

我正在尝试修补一个类及其方法,这是我正在尝试做的一个示例:

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 ======================================================================================

我正在修补该方法,因为我有另一个要测试的另一个类的方法

4

2 回答 2

2

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"

或者,patch 接受 **kwargs,您可以使用它来配置子模拟:

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"
于 2021-06-18T21:39:22.423 回答
-1

你正在修补:

show_color = "red"

但是你的断言试图调用 show_color 就好像它是一个函数

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

这注定要失败,也许你应该测试:

if c.show_color == “red”:
于 2021-06-18T21:15:08.973 回答