gpt4 book ai didi

swift - 多个异步测试和期望

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:12 28 4
gpt4 key购买 nike

我有多个测试,每个测试都在使用给定参数测试相同的异步方法以获得不同的结果。

我发现对于异步测试,我们必须声明期望、等待期望并实现期望。这可以。每个测试在单独完成时都能正确运行,但当我尝试运行整个测试类时,一些测试通过,而另一些测试在正常运行和通过时崩溃或失败。

我在网上到处寻找“swift 3 多项测试与期望”,每个解释期望的人都只有一个测试方法的例子。在同一个类中的多个方法中不能有期望吗?

测试示例如下:

func testLoginWrongUsernameOrPasswordFailure() {
let viewModel = LoginViewModel()
let loginAPI = APIManager()
let expect = expectation(description: "testing for incorrect credentials")

viewModel.loginWith(username: "qwerty", password: "qwerty", completion: { loginCompletion in

do {
try loginCompletion()
XCTFail("Wrong Login didn't error")
expect.fulfill()
} catch let error {
XCTAssertEqual(error as? LoginError, LoginError.wrongCredentials)
expect.fulfill()
}
})

waitForExpectations(timeout: 10) { error in
XCTAssertNil(error)
}
}

据我所知,这是对期望的正确使用,并且每个测试都遵循相同的模式

应 Rob 的要求,我将在此处提供 MCVE https://bitbucket.org/chirone/mcve_test测试类使用模拟 API 管理器,但当我使用真实的 API 管理器进行测试时,错误仍然发生。

作为对代码的解释, View 模型与调用服务器的给定 API 管理器通信,并将响应返回给 View 模型,以便他解释错误或成功。

第一个测试测试空字段, View 模型而不是 APIManager 验证的东西。第二个测试测试不正确的用户名和密码第三个测试测试用户名和密码是否有效

三个单独运行的测试会正常运行,但是当运行整个文件时,我会得到一个 SIGABRT 错误,原因如下:

XCTAssertEqual failed: ("Optional(MCVE.LoginError.wrongCredentials)") is not equal to ("Optional(MCVE.LoginError.emptyFields)") -

*** Assertion failure in -[XCTestExpectation fulfill], /Library/Caches/com.apple.xbs/Sources/XCTest_Sim/XCTest-12124/Sources/XCTestFramework/Async/XCTestExpectation.m:101

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'API violation - multiple calls made to -[XCTestExpectation fulfill] for testing for empty fields.'

SIGABRT 通常发生在第二种测试方法上,如果您点击播放,那么它会在其中一种 XCTest 方法上失败,声称它得到的错误不是它预期的错误。

我希望 MCVE 能帮助解释我的问题。

最佳答案

重构代码如下。

func testLoginWrongUsernameOrPasswordFailure() {
let viewModel = LoginViewModel()
let loginAPI = APIManager()
let expect = expectation(description: "testing for incorrect credentials")

viewModel.loginWith(username: "qwerty", password: "qwerty", completion: { loginCompletion in

do {
try loginCompletion()
XCTFail("Wrong Login didn't error")

} catch let error {
XCTAssertEqual(error as? LoginError, LoginError.wrongCredentials)
}
expect.fulfill()
})

waitForExpectations(timeout: 10) { error in
XCTAssertNil(error)
}
}

如果您仍然遇到以下崩溃,则意味着您的异步代码完成处理程序正在多次调用。然后通过多次调用 expect.fulfill()。这是不允许的。

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'API violation - multiple calls made to -[XCTestExpectation fulfill] for testing for empty fields.'

对于期望,fulfill() 应该只调用一次。如果存在一些罕见的情况并且您需要多次调用 expect.fulfill() 则设置以下属性。

expectedFulfillmentCount

请引用以下链接 https://developer.apple.com/documentation/xctest/xctestexpectation/2806572-expectedfulfillmentcount?language=objc

关于swift - 多个异步测试和期望,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44266990/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com