我是Python的新手。我需要在python中对try-except语句的除部分进行单元测试。我正在使用pytest。问题是我不知道如何强制尝试部件引发异常。这是我的代码:
try:
if master_bill_to is False:
master.update(
dbsession,
company_id=master.company_id,
)
except Exception as e:
dbsession.rollback()
raise Conflict(e.message)
调用master.update方法以对数据库进行更新。但是我如何模拟这个代码,以便它在try部分引发异常?
我试图将monkeypatch与此代码一起使用。主对象是BillTo类的一个实例,所以我想把它作为monkeypatch.setattr的第一个参数。
def test_create_bill_to_fails_when_master_update_fails(dbsession, invoice_group1, company1,
monkeypatch):
def raise_flush_error():
raise FlushError
context = TestContext()
monkeypatch.setattr(BillTo, 'update', raise_flush_error)
with pytest.raises(FlushError):
create_bill_to(
context,
dbsession=dbsession,
invoice_group_id=invoice_group1.id,
company_id=company1.id,
)
但由于某种原因,错误没有提出。
答案 0 :(得分:2)
在测试用例期间使用模拟库和side_effect抛出异常
答案 1 :(得分:0)
模拟master
并在update
方法中引发异常。
答案 2 :(得分:0)
好的,我明白了。我了解到你必须将参数传递给monkeypatch调用的方法。这些参数必须与要替换或模拟的方法的签名匹配。实际上我也用伪名前缀重命名了方法来表示模拟。这是我做的:
@staticmethod
def fake_update_flush_error(dbsession, company_id=None, address_id=None, proportion=None,
company_name=None, receiver_name=None, invoice_delivery_method=None,
invoice_delivery_text=None, master_bill_to=False):
raise FlushError
def test_create_bill_to_fails_when_master_update_fails(dbsession, invoice_group1, company1,
bill_to1, monkeypatch):
context = TestContext()
monkeypatch.setattr(BillTo, 'update', fake_update_flush_error)
with pytest.raises(Conflict):
create_bill_to(
context,
dbsession=dbsession,
invoice_group_id=invoice_group1.id,
company_id=company1.id,
address_id=None,
...
)
BillTo.update方法需要所有这些参数。