Модульное тестирование Flask route - макет ответа об ошибке из маршрута на основе внутренней ошибки памяти - PullRequest
0 голосов
/ 10 апреля 2020

Я просмотрел большую часть соответствующей документации по модульному тестированию Flask и Flask, включая документацию библиотеки Mock, но не смог найти решение для моей проблемы.

I иметь приложение Flask с обработчиком для маршрута /get_calc, который применяет формулу арифметики c к итерируемым числам, предоставляемым из серверной части (не клиентом). Структура проекта приложения:

my_app
├── api.py
├── app
│   ├── __init__.py
│   └── routes.py
├── static_data.py
├── static_data.csv
├── requirements.txt
└── test_app.py

Вот выдержка из routes.py.

from flask import jsonify

from static_data import get_numbers
import app
from app import app

@app.route('/get_calc', methods=['GET'])
def get_calc():
"""
/get_calc request handler
"""
try:
    calc = get_numbers()
except MemoryError as e:
    return jsonify(error=str(e))
else:
    return jsonify(calc=calc)

Потенциально, в зависимости от того, насколько велики числа, участвующие в вычислениях в get_numbers(). MemoryError может быть вызвано там. Я написал тестовый блок для ситуации, когда все работает нормально, а MemoryError не генерируется. Мне нужен тестовый блок для ситуации, когда генерируется MemoryError. Я использую тестовый клиент Flask.

Я пробовал это

import unittest

from unittest.mock import Mock, patch

import app
from app import app as App

App.testing = True

class TestApp(unittest.TestCase):

    ...

    @patch('app.routes.get_calc')
    def test_get_calc__memory_error__returns_error(self, mock_get_calc):
        """
        Test case for the /get_calc endpoint - memory error, error returned.
        """
        with App.test_client() as test_client:
            mock_get_calc.return_value = {'error': MemoryError('test')}
            response = test_client.get('/get_calc')
            self.assertEqual(response.json, {'error': MemoryError('test')})

Я знаю, что, должно быть, я что-то не так делаю, но это, вероятно, сводится к тому, что мы не очень хорошо знаем mock , но я получаю ошибку подтверждения.

>           self.assertEqual(response.json, {'error': MemoryError('test')})
E           AssertionError: {'calc': -2040234.2349} != {'error': MemoryError('test')}
E           - {'calc': -2040234.2349}
E           + {'error': MemoryError('test')}

test_app.py:67: AssertionError

Может кто-нибудь указать, что я делаю неправильно, и как я могу высмеять ответ об ошибке с get_calc?

...