模拟测试动态函数的返回值

时间:2013-10-07 18:41:03

标签: python mocking unittest2

我正在测试使用动态创建函数的返回值的代码。 我需要确保我正在测试的代码使用欺骗性数据调用名为“email_invoice”的函数...

动态创建的函数命中远程系统,所以我伪造了调用的结果。

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)

正如它提到的那样,断言失败了:

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

那么,测试它的正确/正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您要将self.order_id分配给OrderId,但要通过OrderID从API获取ID(请注意字符串末尾的大写字母)。