#swift #testing #vapor
Вопрос:
Я проводил тесты над проектом Vapor, которые успешно выполнялись. Без каких-либо видимых изменений, а также без изменений в процедурах настройки и разбивки, теперь они отказываются запускаться с ошибкой
Vapor/Application.swift:154: Fatal error: Application.shutdown() was not called before Application deinitialized.
2021-08-28 15:15:45.136991 0700 xctest[9353:93515] Vapor/Application.swift:154: Fatal error: Application.shutdown() was not called before Application deinitialized.
У меня включена автоматическая миграция, и я попытался удалить экземпляр docker psql и воссоздать его заново. Приложение отлично работает на локальном хосте и на удаленном сервере: я просто не могу запустить и запустить тесты.
Есть только один тестовый документ, и он начинается с этого:
@testable import App
import XCTVapor
import Fluent
final class NewTests: XCTestCase {
static var app : Application!
static var stdPass = "12345"
var app = NewTests.app
var stdPass = stdPass
// SETUP AND TEARDOWN =================================================
override func setUp() { NewTests.app = try! Application.testable(); app = NewTests.app }
override func tearDown() { NewTests.app.shutdown() }
func testBasicTournamentCreate() throws {
…
}
Есть два теста: один базовый, а другой очень длинный, так как мы должны воспроизвести условия в сложной ситуации со случайным вводом от нескольких пользователей, взаимодействующих с приложением. Похоже, это не проблема, так как, если я проведу только простой короткий тест, я получу тот же результат.
Цели в package.swift
этом выглядят так:
.target(name: "Run", dependencies: [.target(name: "App")]), // comment what follows
.testTarget(name: "AppTests", dependencies: [
.target(name: "App"),
.product(name: "XCTVapor", package: "vapor"),
])
Я помню, что у меня была аналогичная проблема, но некоторая комбинация восстановления базы данных, очистки папки сборки и, в конечном счете, перезапуска исправила ее. Я все это перепробовал, и никаких костей…
Ответ №1:
Вполне вероятно, что тестовое приложение не может подключиться к базе данных. Дважды проверьте конфигурацию своей базы данных и убедитесь, что она соответствует любой тестовой базе данных, к которой вы пытаетесь подключиться.
Самый простой способ узнать, что происходит, — это обернуть любую попытку в do/catch и посмотреть, в чем ошибка. Что происходит, так это то, что что-то выдает ошибку, в результате чего тестовый случай завершается и Application
деинициализирует экземпляр до того, как будет инициирован ваш вызов shutdown
Ответ №2:
Виновником была опечатка в переносе, но в имени поля строкового литерала (поэтому компилятор не уловил ее) и в предложении revert, поэтому это произошло только после инициализации базы данных. Это означало, что я устранил миграцию, потому что после запуска теста я мог видеть полную схему…. ну что ж.
Комментарии:
1. Привет, не могли бы вы опубликовать подробности? Я не уверен, что понимаю, что вы имеете в виду. Спасибо.