2017-02-12 93 views
0

我想测试模拟对象是否被另一个模拟对象调用。测试模拟是否被其他模拟调用

@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

你的代码模仿对象,大概是为了创建一个实例。注意()中所产生的名字:

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

,而你在短短的模拟本身通过:

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

测试为return_value结果:

XeroMock.assert_called_with(CredentialsMock.return_value)