【问题标题】:Pytest: Use a mock in a fixture?Pytest:在夹具中使用模拟?
【发布时间】:2020-04-11 00:13:56
【问题描述】:

这个问题是我上一个问题here的后续问题

我想定义一个fixture,它会为它的每个参数运行一个函数,然后再返回给我。

但是,如果没有另一个验证函数被模拟,该函数就无法运行,因为没有文件系统就无法执行验证。

这是目前的样子:

mocked_validation = mock.Mock() mocked_validation.return_value = True

@pytest.fixture(params = GAMELIST_ROOT_VALUES) def basic_parser(request):
    return GameListParser(request.param)

@pytest.fixture @mock.patch('organizer.parser.game_list_parser.GameListParser.validate', mocked_validation) def ready_parser(basic_parser):
    basic_parser.parse()
    return basic_parser

但是,在验证期间,fixture 将在 basic_parser.parser() 调用中失败。

我使用这个 mock 进行测试,它运行良好,所以它必须与它在夹具中的事实有关。

有没有办法做到这一点?我不希望每次测试都重复这行代码

这可以用下面的类来测试:

class GameListParser(object):

    def __init__(self, value):
        self.value = value

    def parse(self):
        if not self.validate():
            raise Exception("Parsing fail")

    def validate(self):
        return False

编辑:再次尝试,但仍然失败:

@pytest.fixture
def ready_parser(basic_parser):
    with mock.patch('organizer.parser.game_list_parser.GameListParser.validate') as validation:
        validation.return_value = True
        basic_parser.parse()
        return basic_parser

【问题讨论】:

    标签: mocking pytest fixtures


    【解决方案1】:

    找到有产量的解决方案:

    @pytest.fixture()
    def ready_parser(basic_parser):
        with mock.patch('organizer.parser.game_list_parser.GameListParser.validate') as validation:
                validation.return_value = True
                basic_parser.parse()
                yield basic_parser
    

    但我很难过我不能重用我已经为 mocked_validation 定义的定义,我再次尝试作为装饰器但它不起作用

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多