如何在python pytest单元测试中覆盖try的除外部分

时间:2016-05-18 17:02:37

标签: python unit-testing pytest

我是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,
    )

但由于某种原因,错误没有提出。

3 个答案:

答案 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方法需要所有这些参数。