【问题标题】:Python unit tests: How to patch an entire class and methodsPython 单元测试:如何修补整个类和方法
【发布时间】:2018-09-07 10:59:10
【问题描述】:

我正在尝试为编写不佳的现有代码编写单元测试,我发现很难进行单元测试。

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)

但是这似乎没有任何效果。

【问题讨论】:

    标签: python mocking patch


    【解决方案1】:

    我会指出一些问题,但问题缺少一些细节,所以希望我能一口气解决所有问题:

    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()
    

    【讨论】:

      猜你喜欢
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      相关资源
      最近更新 更多