2016-06-03 4 views
0

파이썬에 익숙하지 않지만 C#과 자바 스크립트에서 단위 테스트를 많이 해왔다. 파이썬에서 조롱하는 프레임 워크를 알아내는 데 어려움을 겪고 있습니다. 여기에 내가 (아래 손질) 한 내용은 다음과 같습니다파이썬 유닛 테스트에서 모의이 안되다

invoice_business.py

import ims.repository.invoice_repository as invoiceRepository 
import logging 

logger = logging.getLogger(__name__) 

def update_invoice_statuses(invoices): 
    for invoice in invoices: 
     dbInvoice = invoiceRepository.get(invoice.invoice_id) 
     print("dbInvoice is %s" % dbInvoice) #prints <MagicMock etc.> 

     if dbInvoice is None: 
      logger.error("Unable to update status for invoice %d" % invoice.invoice_id) 
      continue; 

test_invoice_business.py

from unittest import TestCase, mock 
import logging 
import ims.business.invoice_business as business 

class UpdateInvoiceTests(TestCase): 
    @mock.patch("ims.business.invoice_business.invoiceRepository") 
    @mock.patch("ims.business.invoice_business.logger") 
    def test_invoiceDoesNotExist_logsErrorAndContinues(self, invoiceRepoMock, loggerMock): 
     #Arrange 
     invoice = Invoice(123) 
     invoice.set_status(InvoiceStatus.Filed, None) 
     invoiceRepoMock.get.return_value(33) 

     #Act 
     business.update_invoice_statuses([invoice]) 

     #Assert 
     invoiceRepoMock.get.assert_called_once_with(123) 
     loggerMock.error.assert_called_once_with("Unable to update status for invoice 123") 

시험은

AssertionError: Expected 'get' to be called once. Called 0 times.

실패 내가 잘못 여기서 뭘하는지

dbInvoice is <MagicMock name='invoiceRepository.get()' id='xxxx'> 

어떤 생각의 결과를 볼 수 있기 때문에 update_invoice_statuses에서문은, 그러나, 당한다?

편집는 @의 chepner의 도움 후, 나는 또 다른 주장의 오류로 실행하고 나는 .return_value(None)

답변

3

테스트 함수에 대한 모의 인수가 교환되는 것이 아니라 invoiceRepoMock.get.return_value = None을 사용해야 있기 때문에 깨달았다. 로거 용 내부 데코레이터가 먼저 적용되므로 모의 로거가 메소드의 첫 번째 인수 여야합니다.

@mock.patch("ims.business.invoice_business.invoiceRepository") 
@mock.patch("ims.business.invoice_business.logger") 
def test_invoiceDoesNotExist_logsErrorAndContinues(self, loggerMock, invoiceRepoMock): 
    ... 
+0

고맙다. 나는 내가 그 사실을 알아 차렸을 것이라고 생각하지 않는다. – mdickin

관련 문제