这个测试给了我不寻常的问题:
我测试的略微简化版本:
def test_credit_create_view(self):
""" Can we create cards? """
card_data = {'creditcard_data': 'blah blah blah'}
with patch('apps.users.forms.CustomerAccount.psigate') as psigate:
info = MagicMock()
info.CardInfo.SerialNo = 42
create = MagicMock(return_value=info)
psigate.credit.return_value = create
self.client.post('/make-creditcard-now', card_data)
我试图模仿的电话看起来像这样:
psigate.credit().create().CardInfo.SerialNo
在测试中,该调用只返回一个MagicMock对象。
如果我只查看该调用中的最后三个节点,我会得到正确的结果:
create().CardInfo.SerialNo
返回42
为什么没有完全调用“psigate.credit()。create()。CardInfo.SerialNo'回到42?
答案 0 :(得分:2)
您要将psigate.credit的返回值设置为create,这意味着psigate.credit()是您的模拟'create',而不是psigate.credit()。create。如果您调用psigate.credit()(),这将按预期工作。
当您调用psigate.credit()。create()时,您将动态创建一个新的MagicMock对象,而不是调用您定义的对象。