методы pytest monkeypatch с возвращаемыми значениями из параметризованного метода - PullRequest
1 голос
/ 12 марта 2020

Я работаю над написанием некоторых тестов для приложения python с каркасом pytest. У меня проблема в одном из тестов, но я не уверен, как он работает.

пример:

@pytest.mark.parametrize("result, status, xml_err, xml_status",[
        ("PASS",True,False,"XML_ERROR"),
        ("Validation error", False, False, "XML_ERROR")
    ])
def test_xml_build_neg(self, monkeypatch,result, status, xml_err, xml_status):

    def validate(self):
        return status, result, {}

    def transform(self, v_dict):
        return "<xml/>", 50.0, xml_status, xml_err



    monkeypatch.setattr(DataValidator, "validate", validate)
    monkeypatch.setattr(XMLTransformer, "transform", transform)


    o_result, o_status, o_xml_err, o_xml_status= XMLOutputBuilder().build(ExtractionResult(), "test", b"test")

    assert o_result == result, "Validation results not matching"
    assert o_status == status, "Validation Status not matching"
    .....

Я сделал monkeypatch для некоторых методов внутри XMLOutputBuilder чтобы проверить сценарий ошибки ios. Я ожидал, что мои фиктивные методы будут возвращать значения на основе входящих параметров, но это не так. Я понимаю, что такое поведение связано с тем, что макеты и приборы загружаются только один раз, и их нельзя изменить дальше (поправьте меня, если я ошибаюсь).

Есть ли другие способы заставить этот сценарий работать? Или я должен написать отдельные методы испытаний для параметров?

1 Ответ

0 голосов
/ 13 марта 2020

Я не могу воссоздать проблему. Возможно, выполняется другой путь к коду, чем тот, для которого установлены атрибуты monkeypatch.

В приведенном ниже минимальном примере я добавил некоторые сложности в ваш пример: класс A в модуле a.py с функцией validate, которую необходимо пропатчить:

class A:
    def validate(self):
        status, result = "not", "patched"
        return status, result

Класс B в модуле b.py с использованием функциональности из класса A в модуле a.py:

import a
class B():

    def build(self):
        return a.A().validate()

Тестовый модуль test.py:

import pytest
from a import A
from b import B

@pytest.mark.parametrize("arg1, arg2", [("foo1", "bar1"), ("foo2", "bar2")])
def test_monkeypatch_with_params(monkeypatch, arg1, arg2):

    def validate(self):
        print(arg1, arg2)
        return arg1, arg2

    monkeypatch.setattr(A, "validate", validate)

    actual_status, actual_result = B().build()
    assert actual_status == arg1
    assert actual_result == arg2

, выполненный как :

pytest test.py -s 
...