vendredi 3 juin 2016

Mocks not getting hit in Python unit tests

I'm new to Python, but I've done quite a bit of unit testing in C# and JavaScript. I'm having trouble figuring out the mocking framework in Python. Here's what I have (trimmed down):

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")

The test fails with "AssertionError: Expected 'get' to be called once. Called 0 times." The print statement in update_invoice_statuses gets hit, though, because I see the output of "dbInvoice is

Any idea what I'm doing wrong here?

Aucun commentaire:

Enregistrer un commentaire