В вашем коде есть несколько ошибок, поэтому это нелегко объяснить.
Прежде всего, рекомендуется использовать тестирование с Flask (и Flask -Restful) PyTest вместо unittest , потому что его проще в настройке и использовании.
Ознакомьтесь с документацией: Тестирование Flask Приложения .
Но вы можете начать с unittest…
примечание: вы можете запутаться с вашим модулем app
и экземпляром app
в этом модуле. Итак, чтобы избежать этого, я импортировал модуль. Еще одна хорошая практика - назовите свой тестовый модуль по отношению к протестированному модулю: "app.py" => "test_app.py". У вас также может возникнуть путаница с модулем controller
и экземпляром controller
. Лучше всего использовать более точное имя, например «controller_foo» или что-то еще…
Вот тест работающего модуля:
# test_app.py
import unittest
import app
class ControllerTestCase(unittest.TestCase):
def setUp(self):
self.app = app.app
self.app.config['TESTING'] = True
self.client = self.app.test_client()
self.payload = {'its': 'empty'}
def test_get_response(self):
response = self.client.post('/ctrl', json=self.payload)
expected_resp = {'foo': 'bar'}
self.assertEqual(response.status_code, 200)
self.assertDictEqual(response.get_json(), expected_resp)
if __name__ == "__main__":
unittest.main()
Как вы можете видеть, я также исправил опубликованный URL-адрес, в вашем приложении URL-адрес «/ ctrl», а не «controller».
На этом этапе тест можно запустить, но у вас есть другая ошибка:
Ran 1 test in 0.006s
FAILED (errors=1)
Error
Traceback (most recent call last):
...
TypeError: process_request() takes 1 positional argument but 2 were given
Если вы посмотрите на метод process_request()
, вы увидите, что пропустили параметр self
. Измените его следующим образом.
def process_request(self, data):
# do some stuffs here
return {'foo': 'bar'}
Ваш тест должен пройти.
Но это не правильный способ реализации Flask -Restful контроллеров. Прочитайте do c и используйте get
и post
методы…