我正在为使用pytest
框架的python应用程序编写一些测试。我在其中一个测试中遇到了问题,我不确定它的工作方式。
示例:
@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"
.....
我在XMLOutputBuilder
中为一些方法做了monkeypatch
,以测试一些错误场景。我原以为mock方法会返回基于传入参数的值,但它没有。我理解这种行为是因为模拟和固定装置只加载一次,不能再更改(如果我错了,请纠正我(。
有没有其他方法可以让这个场景发挥作用?或者我必须为参数编写单独的测试方法?
我无法重新创建问题。可能执行的代码路径与猴痘属性的设置不同。
在下面的最小示例中,我添加了您示例中的一些复杂性:模块a.py
中的一类A
,具有待修补的validate
功能:
class A:
def validate(self):
status, result = "not", "patched"
return status, result
模块b.py
中的类B
使用来自模块a.py
中的类A
的功能:
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