Тесты в парах выдали фатальную ошибку перед запуском тестов

#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. Привет, не могли бы вы опубликовать подробности? Я не уверен, что понимаю, что вы имеете в виду. Спасибо.