gpt4 book ai didi

Python 单元测试 : How to patch an entire class and methods

转载 作者:行者123 更新时间:2023-12-05 02:15:17 26 4
gpt4 key购买 nike

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

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. 您的语法错误:@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. 您需要分配/使用您的补丁的返回值,而不是直接从模拟中访问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()

关于Python 单元测试 : How to patch an entire class and methods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52221123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com