Модульное тестирование приложения flask, но избегайте вызова других методов - PullRequest
0 голосов
/ 11 марта 2020

У меня есть небольшое приложение Python (Flask), которое прослушивает порт 8080 для запроса POST. Я пишу несколько юнит-тестов, но мне было интересно, как мне избежать вызова , который он совершает в другой метод, например, для LINE номер 11 в моем модульном тесте, Я просто хочу иметь возможность проверить POST и проверить код ответа 200, если передается правильная информация.

main.py

1 @app.route("/endpoint/", methods=['POST'])
2 def mypostmethod():
3
4    if 'Content-Type' in request.headers and request.headers['Content-Type'] == 'application/json':
5        post_data = request.json
6
7        req_data = request.get_json()
8        content = req_data['content']
9
10       #####--How to avoid this in unit test--start--
11       result = someClass.someMethod(content)
12       #####--How to avoid this in unit test--end--
13
14       return content
15
16   else:
17   if not 'Content-Type' in request.headers:
18       return Response("No Content-Type set in request header", status='400')
19
20   if request.headers['Content-Type'] != 'application/json':
21       return Response("Content-Type in request header should be application/json", status='400')

Мой модульный тест выглядит так:

test_main.py

import json
import main
import unittest

content = 'hello'

class PublicTestCase(unittest.TestCase):
    def setUp(self):
        self.app = main.app.test_client()

    def test_send_valid_request(self):
        headers = {
            'Content-Type': 'application/json'
        }
        request_body = {
            'content': content
        }

        response = self.app.post('/endpoint',
                                 headers=headers,
                                 data=json.dumps(request_body),
                                 follow_redirects=True)

        assert response.status_code == 200

1 Ответ

0 голосов
/ 11 марта 2020

Недавно я использовал этот способ для запуска метода, только если pytest НЕ был sys.argv. но он может работать и с unittest. Вот так 10 #####--How to avoid this in unit test--start-- -10 if not any(['unittest' in arg for arg in sys.argv]): -10 # eval to false when running the cmd pytest 11 result = someClass.someMethod(content) 12 #####--How to avoid this in unit test--end-- Другой способ - установить env var во время выполнения на вашем приборе. Надеюсь, это поможет. Между прочим, этот код не тестировался, поэтому может быть синтаксис, который может дать вам только идею.

...