2017-02-12 15 views
0

Я пытаюсь проверить, был ли вызван макет объекта с другим макетным объектом.Тестирование, если mock был вызван с другим макетом

@patch(__name__ + '.xero_helper.PublicCredentials') 
@patch(__name__ + '.xero_helper.Xero') 
def testGetValidPublicXeroInstance(self, XeroMock, CredentialsMock): 
    xero_helper.get_xero_instance('abc') # Do relevant stuff 

    CredentialsMock.assert_called_with(**org.oauth_credentials) # OK 
    XeroMock.assert_called_once() # OK 
    XeroMock.assert_called_with(CredentialsMock) # Not OK 

Первые два assert сек проход, в то время как последняя дает

AssertionError: Expected call: Xero(<MagicMock name='PublicCredentials' id='4377636560'>) 
Actual call: Xero(<MagicMock name='PublicCredentials()' id='4377382544'>) 

Что бы правильный способ проверки XeroMock был вызван с CredentialsMock?

+0

В будущем, пожалуйста, укажите код испытание тоже; Я могу решить из ошибки утверждения, что проблема, но было бы проще с фактическим кодом (или рабочей заменой для него, который производит тот же вывод). Это называется [MCVE]. –

+0

Еще одна альтернатива может заключаться в реструктуризации кода, так что есть альтернативы способам инжекции чужих, кроме как через '@ patch'. Популярным может быть инъекция зависимости. Возможно, 'get_xero_instance' может принять' ** kwargs' и разрешить вызывающему абоненту создать экземпляр 'CredentialsMock'? – dm03514

ответ

2

Ваш код CredentialsMock макет объекта, предположительно для создания экземпляра. Обратите внимание на () в результате имя:

<MagicMock name='PublicCredentials()' id='4377382544'> 
#         ^^ called 

в то время как вы прошли всего самого издеваться:

<MagicMock name='PublicCredentials' id='4377636560'> 
#        ^not called 

Тест на return_value результат:

XeroMock.assert_called_with(CredentialsMock.return_value)