Модульные тесты Python: как исправить весь класс и методы - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь написать юнит-тесты для существующего кода, который плохо написан, и мне очень трудно выполнить юнит-тест.

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 Ответ

0 голосов
/ 10 сентября 2018

Есть несколько проблем, на которые я укажу, но в этом вопросе отсутствуют некоторые детали, поэтому, надеюсь, я смогу решить их все за один раз:

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