测试模拟是否被其他模拟调用
问题描述:
我想测试模拟对象是否被另一个模拟对象调用。测试模拟是否被其他模拟调用
@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
正确的方法是什么?
答
你的代码叫模仿对象,大概是为了创建一个实例。注意()
中所产生的名字:
<MagicMock name='PublicCredentials()' id='4377382544'>
# ^^ called
,而你在短短的模拟本身通过:
<MagicMock name='PublicCredentials' id='4377636560'>
# ^not called
测试为return_value
结果:
XeroMock.assert_called_with(CredentialsMock.return_value)
在未来,请提供代码也在测试中;我可以从断言错误中找出问题所在,但实际代码(或者替代它,产生相同的输出)会更容易。这被称为[MCVE]。 –
另一种选择可能是重构代码,所以除了'@ patch'之外,还有其他替代方法可以注入模拟。一个受欢迎的可能是依赖注入。也许'get_xero_instance'可以接受'** kwargs'并允许调用者提供'CredentialsMock'实例? – dm03514