我正在尝试为现有代码编写单元测试,但这些代码写得很差,而且我发现很难进行单元测试。
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)
然而,这似乎没有任何影响。
我会指出一些问题,但这个问题缺少一些细节,所以希望我能一次性解决它们:
-
你这里的语法是错误的:
@patch checkout.pay.NewFraudCheck
.应该是@patch('checkout.pay.NewFraudCheck')
-
某处缺少一个具有函数
pay(self)
的类。该类位于模块中的某个位置,这对于正确模拟NewFraudCheck
很重要。我将缺少的模块称为other
。 -
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 -
您需要分配/使用
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()