该测试给我带来了不寻常的问题:

我的测试略有简化:

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?

最佳答案

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

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

关于python - 使用Python Mock修补API,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21886143/

10-09 05:35