Python单元测试:如何修补整个类和方法

时间:2018-09-07 10:59:11

标签: python mocking patch

我正在尝试为现有代码编写的单元测试编写得很差,我发现很难进行单元测试。

def pay(self):
    fraud = NewFraudCheck()
    result, transaction = fraud.verify_transaction()

我目前正在测试,我正在修补NewFraudCheck类

@patch checkout.pay.NewFraudCheck
def test_pay(self, mock_fraud_check):
    mock_fraud_check.verify_transaction.assert_called()

测试失败并显示ValueError,表明verify_transaction没有返回足够的值来解压缩。

我尝试添加

mock_fraud_check.verify_data.return_value = (1, 1231231)

但这似乎没有任何效果。

1 个答案:

答案 0 :(得分:0)

我将指出一些问题,但是这个问题缺少一些细节,因此希望我能一枪解决所有问题:

  1. 您的语法错误:@patch checkout.pay.NewFraudCheck。应该是@patch('checkout.pay.NewFraudCheck')

  2. 某处缺少一个类,上面带有函数pay(self)。该类存在于某个模块中,该模块对于正确模拟NewFraudCheck很重要。我将缺少的模块称为other

  3. NewFraudCheck需要在查找时打补丁。这就是说,在神秘的模块other中,其中定义了一个类pay(self),大概是导入了from pay import NewFraudCheck那个是查找NewFraudCheck的地方,因此您的补丁必须看起来像这样:@patch('checkout.other.NewFraudCheck)。此处更多信息:http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch

  4. 您需要分配/使用patch的返回值,而不是直接从模拟中访问verify_transaction。例如,它应显示为:mock_fraud_check.return_value.verify_transaction.return_value = (1, 1231231)。请注意,其中包含return_value

我想出的最终测试是这样的,并通过了:

    @mock.patch('checkout.other.NewFraudCheck')
    def test_pay(self, mock_fraud_check):
        # This is the class that lives in mystery module, 'checkout.other' and calls pay()
        other_class = SomeOtherClass()
        mock_fraud_check.return_value.verify_transaction.return_value = (1, 1231231)
        other_class.pay()
        mock_fraud_check.return_value.verify_transaction.assert_called()