Удаление тестовой базы данных в Vapor 3 - PullRequest
0 голосов
/ 19 ноября 2018

Я хочу написать несколько интеграционных тестов для сервера Vapor 3, и мне нужно иметь чистую базу данных Postgre каждый раз, когда я запускаю свои тесты. Как мне этого добиться? Похоже, что миграция - это не правильный путь, поскольку они выполнялись один раз, если база данных еще не существует.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Я нашел решение, которое требует меньше ресурсов, чем каждый раз возвращать все миграции.

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.

0 голосов
/ 20 ноября 2018

Посмотрите на https://github.com/raywenderlich/vapor-til/tree/master/Tests

Для этого требуется, чтобы БД была запущена перед запуском тестов, но при каждом запуске тестов она отменяет все миграции, что каждый раз дает вам чистую БД. (В частности, здесь )

В корневом каталоге также есть docker-compose.yml для раскрутки полностью изолированной тестовой среды в Linux

...