2013-10-07 2 views
0

Я тестирую код, который использует возвращаемое значение динамически созданной функции. Мне нужно убедиться, что код, который я тестирую правильно, вызывает функцию, называемую «email_invoice» с поддельными данными ...mock тестирование возвращаемого значения динамической функции

Динамически созданная функция попадает в удаленную систему, поэтому я фальсифицирую результат вызова ,

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

Вы присваиваете 'self.order_id'' OrderId', но получаете идентификатор API от 'OrderID' (обратите внимание на верхний регистр в конце строки) –

+0

Добавьте это как ответ, и я могу принять ... –

ответ

1

Вы назначаете self.order_id в OrderId, но получаете идентификатор API от OrderID (обратите внимание на верхний регистр в конце строки).

+0

Ага. Я понял, что это будет проблемой, потому что я не могу использовать функции auto_spec для патча: P –

+0

А, хотя опечатка была проблемой, происходит то, что клиент suds перезаписывает патч, когда он создает методы (или, по крайней мере, обходит патч с использованием динамического __getattr__) –

+1

Вы также можете исправить этот метод или исправить функцию, которую клиент прикрепляет к атрибуту «CreateOrder». –

Смежные вопросы