使用Python Mock修补API

时间:2014-02-19 16:14:57

标签: python unit-testing testing mocking

这个测试给了我不寻常的问题:

我测试的略微简化版本:

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?

1 个答案:

答案 0 :(得分:2)

您要将psigate.credit的返回值设置为create,这意味着psigate.credit()是您的模拟'create',而不是psigate.credit()。create。如果您调用psigate.credit()(),这将按预期工作。

当您调用psigate.credit()。create()时,您将动态创建一个新的MagicMock对象,而不是调用您定义的对象。