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)
但这似乎没有任何效果。
我会指出一些问题,但问题缺少一些细节,所以希望我能一次性解决所有这些问题:
你这里的语法是错误的:@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()
Run Code Online (Sandbox Code Playgroud)