Я нашел решение, которое требует меньше ресурсов, чем каждый раз возвращать все миграции.
RSpec имеет конфигурацию (use_transactional_fixtures
), которая позволяет оборачивать каждый тест в транзакцию SQL.Когда тестирование закончено, он откатит транзакцию и, следовательно, отменит все изменения, произошедшие во время тестирования.Соответствующая документация находится здесь .
Мы можем реализовать подобное решение в Vapor.Мой пример теста выглядит следующим образом.
final class VaporTests: XCTestCase {
var app: Application!
override func setUp() {
super.setUp()
app = try! Application.buildForTesting()
let conn = try! app.requestPooledConnection(to: .psql).wait()
try! conn.simpleQuery("BEGIN TRANSACTION").wait()
try! app.releasePooledConnection(conn, to: .psql)
}
override func tearDown() {
let conn = try! app.requestPooledConnection(to: .psql).wait()
try! conn.simpleQuery("ROLLBACK").wait()
try! app.releasePooledConnection(conn, to: .psql)
super.tearDown()
}
func testExample() throws {
let request = HTTPRequest(method: .GET, url: "my/endpoint/example")
let wrapper = Request(http: request, using: app)
let response = try ExampleController().example(wrapper).wait()
XCTAssertEqual(response, .ok)
}
}
Чтобы избежать проблем с параллелизмом, я ограничиваю пул базы данных одним подключением в тестовом приложении.
func configure(_ config: inout Config, _ env: inout Environment, _ services: inout Services) throws {
// ... other configurations
let poolConfig = DatabaseConnectionPoolConfig(maxConnections: 1)
services.register(poolConfig)
}
Большое спасибо Jakub Jatczak за помощь в выяснении, как это происходит в Rails.