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



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

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

我目前的测试,我正在修补新欺诈检查类

@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. 你这里的语法是错误的:@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()

相关内容

  • 没有找到相关文章

最新更新