Почему мой модульный тест flask не использует базу данных временных файлов, когда я указал это?

#python #flask

#python #flask

Вопрос:

Тест по-прежнему выполняет запись в мою базу данных MySQL вместо базы данных временных файлов sqlite. Почему это происходит? Спасибо!

Вот мой код:

 class UserTests(unittest.TestCase):

    def setUp(self):
        self.app = get_app()
        #declare testing state
        self.app.config["TESTING"] = True
        self.db, self.app.config["DATABASE"] = tempfile.mkstemp()
        #spawn test client
        self.client = self.app.test_client()
        #temp db
        init_db()

    def tearDown(self):
        os.close(self.db)
        os.unlink(self.app.config["DATABASE"])

    def test_save_user(self):
        #create test user with 3 friends
        app_xs_token = get_app_access_token(APP_ID, APP_SECRET)
        test_user = create_test_user(APP_ID, app_xs_token)
        friend_1 = create_test_user(APP_ID, app_xs_token)
        friend_2 = create_test_user(APP_ID, app_xs_token)
        friend_3 = create_test_user(APP_ID, app_xs_token)
        make_friend_connection(test_user["id"], friend_1["id"], test_user["access_token"], friend_1["access_token"])
        make_friend_connection(test_user["id"], friend_2["id"], test_user["access_token"], friend_2["access_token"])
        make_friend_connection(test_user["id"], friend_3["id"], test_user["access_token"], friend_3["access_token"])

        save_user(test_user["access_token"]) 
  

Ответ №1:

Эта строка может быть проблемой:

 self.db, self.app.config["DATABASE"] = tempfile.mkstemp()
  

print извлеките значения self.db и self.app.config["DATABASE"] и убедитесь, что они соответствуют вашим ожиданиям.

Ответ №2:

Вероятно, вы хотите выяснить, где в коде вашей базы данных указана ваша конфигурация self.app.config["DATABASE"] .

Код примера Flask обычно выполняет большую работу при первом импорте модуля. Это приводит к сбоям при попытке динамически изменять значения во время выполнения, потому что к тому времени уже слишком поздно.

Вероятно, вам потребуется использовать фабрику приложений, чтобы ваше приложение не было создано до запуска тестового кода. Кроме того, шаблон app factory подразумевает, что вы используете интерфейс Blueprint вместо прямой app ссылки, которая получается с помощью циклического импорта в коде примера.