Flask Unittest - ошибка типа из-за аргумента NoneType - PullRequest
0 голосов
/ 31 марта 2020

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

settings.py

     import os
     TARGET_VAR = os.getenv('TARGET_VAR_VALUE')

некоторый apiclass

     from settings import TARGET_VAR
     class someApi:
         def __init__(self):
                print(TARGET_VAR) // good if running normally
     ....rest of func

test

   def test_extreme_devices(self):
      app = Flask(__name__)
      app.config["LOGIN_DISABLED"] = True


      api = flask_restful.Api(app)

      api.add_resource('someApi', '/devices/')

      with app.test_client() as client:
         res = client.get('/devices/')

         self.assertEqual(res.status_code, 200)

.env

 TARGET_VAR_VALUE='some target value'

Это работает хорошо, но не при запуске test Я запутался при запуске test для тестирования класса someApi, я получил ошибка

     TypeError: int() argument must be a string, a bytes-like object or a number, not 
     'NoneType'

, очевидно, для TARGET_VAR равна NoneType, даже если ее значение установлено в .env

Это будет работать, если я добавлю фактическое значение непосредственно к нему

   TARGET_VAR = 'actual value'

Эта проблема возникает только на юнит-тесте, но не когда flask работает и получает доступ к маршруту (как почтальон)

1 Ответ

0 голосов
/ 01 апреля 2020

Может случиться так, что при локальном запуске приложения flask в среду уже загружается TARGET_VAR_VALUE в среду os.

Если вы используете что-то вроде python -dotenv при проведении юнит-тестов вы можете быть уверены, что существует согласованная среда. Просто указав правильный файл .env для использования и убедившись, что он переопределяет любые другие переменные env:

from dotenv import load_dotenv

load_dotenv("tests/test.env", override=True)

tests/test.env

TARGET_VAR_VALUE='some target value'
...