我正在尝试为现有代码编写的单元测试编写得很差,我发现很难进行单元测试。
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)
但这似乎没有任何效果。
答案 0 :(得分:0)
我将指出一些问题,但是这个问题缺少一些细节,因此希望我能一枪解决所有问题:
您的语法错误:@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()