pythonmockingunittest2

mock testing the return value of a dynamic function


I am testing code that uses the return value of a dynamically created function. I need to make sure that the code that I am testing correctly calls a function called 'email_invoice' with the spoofed data...

The dynamically created function hits a remote system, so I am faking the result of the call.

class MyTest(unittest2.Test):

    def setUp(self):

        patcher = mock.patch('soc.product.views.API')
        patch = patcher.start()

        self.order_id = 'fake_order_id'

        # The `API` class has methods that are dynamically created.
        # The method `API.CreateOrder` needs to be patched to return `self.order_id`
        # When testing that a resulting method is called, I get a failed assertion:

        #AssertionError: Expected call: email_invoice(<User: User(id=46, merchant_id=503579)>, 'fake123123123')
        #Actual call: email_invoice(<User: User(id=46, merchant_id=503575)>, <MagicMock name='API().CreateOrder().OrderID' id='140700602174736'>)

        # soc.product.views.API.CreateOrder => self.order_id
        CreateOrderResult = mock.NonCallableMock()
        CreateOrderResult.OrderId = self.order_id
        patch.CreateOrder = mock.Mock()
        patch.CreateOrder.return_value = CreateOrderResult


    def test_that_stuff_out_homie(self):

         ... doing stuff ...

         user = ... a result of doing stuff ...

         self.patches['email_invoice'].assert_called_once_with(user, self.order_id)

As it mentions, the assertion fails like this:

AssertionError: Expected call: email_invoice(<User: User(id=46, merchant_id=503579)>, 'fake123123123')
Actual call: email_invoice(<User: User(id=46, merchant_id=503575)>, <MagicMock name='API().CreateOrder().OrderID' id='140700602174736'>)

So, what is the proper/correct way to test this out?


Solution

  • You are assigning self.order_id to OrderId but getting the id from API by OrderID (notice the uppercase at the end of the string).