swift - 为什么在实施单元测试时我的 postgres 表不存在?
问题描述
我开始在 Vapor 4 项目中实施单元测试,但users
在每次测试后都没有删除/创建 postgres 表。它仅适用于 1 次测试,然后才会全部崩溃。
即使我没有实施任何测试,编译器也会因以下错误而停止:
caught error: "previousError(server: table "users" does not exist (DropErrorMsgNonExistent))"
我的数据库在 Docker 容器中使用 PostgreSQL 运行。当我手动删除此容器并再次运行测试时,没有错误。当我第二次运行它时,错误又回来了。
为什么每次测试后我的表都没有被删除?
这是我的测试文件,我已经实现了一个简单的测试来尝试管道:
import XCTVapor
@testable import App
class BaseXCTestCase: XCTestCase {
var app: Application!
override func setUpWithError() throws {
try super.setUpWithError()
app = Application(.testing)
try configure(app). // The error is caught here.
}
override func tearDownWithError() throws {
app.shutdown()
try super.tearDownWithError()
}
// This test crashes if everything goes well, but it
// doesn't even run as the crashes appears in configure.swift.
func test_zero() {
XCTFail("Tests not yet implemented")
}
}
这是我的users
桌子:
import Fluent
struct UserModelMigration_v1_0_0: Migration {
func prepare(on database: Database) -> EventLoopFuture<Void> {
database.schema("users")
.id()
.field("email", .string, .required)
.field("password", .string, .required)
.field("appleID", .string)
.unique(on: "email")
.create()
}
func revert(on database: Database) -> EventLoopFuture<Void> {
database.schema("users").delete()
}
}
这是我configure.swift
为测试设置迁移的文件的一部分:
import Fluent
import FluentPostgresDriver
import Vapor
public func configure(_ app: Application) throws {
// MARK: Database
let databaseName: String
let databasePort: Int
if app.environment == .testing {
databaseName = "db_testing"
databasePort = 5434
}
else {
databaseName = "db_development"
databasePort = 5433
}
app.databases.use(.postgres(
hostname: "localhost",
port: databasePort,
username: "username",
password: "password",
database: databaseName
), as: .psql)
// MARK: Migrations
app.migrations.add(UserModelMigration_v1_0_0())
// MARK: Clear Database
if app.environment == .testing {
try app.autoRevert().wait()
}
if !app.environment.isRelease {
try app.autoMigrate().wait()
}
}
还有两个文件,我在其中添加了代码以在 Docker 容器中运行测试。
文件:docker-compose-testing.yml
version: '3'
services:
serverside-app:
depends_on:
- postgres
build:
context: .
dockerfile: testing.Dockerfile
environment:
- DATABASE_HOST=postgres
- DATABASE_PORT=5434
postgres:
image: "postgres"
environment:
- POSTGRES_DB=db_testing
- POSTGRES_USER=username
- POSTGRES_PASSWORD=password
文件:testing.Dockerfile
FROM swift:5.3
WORKDIR /package
COPY . ./
CMD ["swift", "test", "--enable-test-discovery"]
解决方案
如果表不存在,您的还原将失败。将其更改为try? app.autoRevert().wait()
和您的自动迁移try? app.autoMigrate().wait()
将忽略任何错误。
推荐阅读
- django - 我怎样才能缩短这个 django 查看请求?
- xamarin.android - Xamarin.Android如何限制编辑文本字段只允许小数点前1个数字和小数点后2个数字?
- delphi - TChart 问题:我的条形图的条形应该均匀分布而不是重叠
- java - 处理索引 0 超出长度 0 的范围以验证用户方法
- php - 如何回显警报?
- wordpress - Wordpress 站点完成从一台服务器到另一台 wordpress 的迁移
- r - r闪亮应用程序中基于当前周的上周总和值
- android - 为什么 Navigator pushNamedAndRemoveUntil 没有按预期工作?
- postgresql - 我无法在 pgadmin 4 v4 中运行服务器
- python - LightGBM 错误:ValueError:对于提前停止,评估需要至少一个数据集和评估指标