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

use*_*855 3 python patch mocking

我正在尝试为现有代码编写单元测试,这些代码编写得不好,并且我发现单元测试非常困难。

def pay(self):
    fraud = NewFraudCheck()
    result, transaction = fraud.verify_transaction()
Run Code Online (Sandbox Code Playgroud)

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

@patch checkout.pay.NewFraudCheck
def test_pay(self, mock_fraud_check):
    mock_fraud_check.verify_transaction.assert_called()
Run Code Online (Sandbox Code Playgroud)

测试失败并出现 ValueError,表明 verify_transaction 没有返回足够的值来解包。

我尝试过添加

mock_fraud_check.verify_data.return_value = (1, 1231231)
Run Code Online (Sandbox Code Playgroud)

但这似乎没有任何效果。

who*_*ski 5

我会指出一些问题,但问题缺少一些细节,所以希望我能一次性解决所有这些问题:

  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()
Run Code Online (Sandbox Code Playgroud)