2016-05-18 99 views
-1

私はPythonが初めてです。私はPythonでtry-exceptステートメントの例外部分を単体テストする必要があります。私はpytestを使用しています。問題は、try部に強制的に例外を発生させる方法がわからないことです。私のコードは次のとおりです。python pytestユニットテストでtry-exceptの例外部分をカバーする方法

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部分の例外を発生させるようにこのコードを模擬しますか?

私はこのコードでモンキーパッチを使用しようとしています。マスターオブジェクトは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

Pythonの模擬を検索しようとしましたか? – jonrsharpe

答えて

0

モックmasterupdate方法で例外を発生させます。

2

使用モックライブラリとside_effectテストケース

0

[OK]を中に例外を投げるために、私はそれを考え出しました。私はmonkeypatchというメソッドにパラメータを渡さなければならないことを知りました。これらのパラメータは、置き換えられるメソッドまたはモックされるメソッドのシグネチャと一致する必要があります。実際に私はまた、fake_という接頭辞を持つメソッドの名前を変更して、嘲笑を示しています。ここで私は何をしたのですか:

@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メソッドには、これらすべてのパラメータが必要でした。

関連する問題