【发布时间】:2020-05-29 10:43:44
【问题描述】:
应用程序本身运行良好,但我无法进行确认这一点的测试。
在下面的第 1 部分中,测试检查使用电子邮件和(正确的)密码登录是否成功,并返回正确的 URL 重定向。在重定向返回测试之前的代码中,调试显示对request.auth.require(User.self) 的调用成功。
在第 2a 部分和第 2b 部分中,XCTAssertEqual 失败,并且日志显示调用 request.auth.require(User.self) 的结果引发了错误,提示用户未获得授权。
第 3 部分再次检查第 1 部分是否正常工作,因为它也为不成功的登录返回正确的 URL 重定向。
因此,似乎会话数据在调用.test(...) 之后没有被保留。有没有办法解决这个问题?
@testable import App
import XCTVapor
final class AppTests: XCTestCase
{
func test011UserLoginLogout() throws
{
func attemptLogin(withPassword password:String, completion:(XCTHTTPResponse) throws -> ()) throws -> Void
{
var body = ByteBufferAllocator().buffer(capacity: 0)
body.writeString(#"{"email":"me@example.com","password":"\#(password)"}"#)
var headers = HTTPHeaders()
headers.replaceOrAdd(name: .contentLength, value: body.readableBytes.description)
headers.contentType = .json
try app.test(.POST, "/login", headers:headers, body:body) { response in try completion( response ) }
}
var app = Application(.testing)
app.databases.use(.mysql(hostname:DBHost, username:DBAccount, password:DBPassword, database:DBDatabase, tlsConfiguration:.none), as:.mysql)
app.databases.default(to:.mysql)
do { try configure(app!) }
catch { XCTFail("configure(app) failed") }
// Part 1 succeeds
try attemptLogin(withPassword:"goodPassword")
{
res in
XCTAssertEqual(res.status, HTTPResponseStatus.seeOther)
XCTAssertEqual(res.headers["location"].first,"success")
try app!.test(.GET, "/success")
{
response in
XCTAssertEqual(response.status, .ok) // <--- Part 2(a) fails
}
}
try app.test(.GET, "/success")
{
response in
XCTAssertEqual(response.status, .ok) // <-- Part 2(b) fails
}
// Part 3 succeeds
try attemptLogin(withPassword:"badPassword")
{
response in
XCTAssertEqual(response.status, .seeOther)
XCTAssertEqual(response.headers["location"].first,"failed")
}
}
}
【问题讨论】: