【问题标题】:Testing API call that happens at app launch results in multiple calls to fulfill测试在应用启动时发生的 API 调用会导致多次调用来完成
【发布时间】:2025-11-21 18:10:01
【问题描述】:

我第一次尝试在现有应用上实施单元测试。首先,与我在教程中看到的相反,应用程序在我尝试运行单元测试时启动。我尝试在我的测试目标上将 Host App 设置为“无”,但遇到了几个与“未找到符号”错误有关的问题。

然后,即使应用程序启动,我也继续尝试运行单元测试,但我遇到了以下错误:

'NSInternalInconsistencyException',原因:'API 违规 - 多次调用 -[XCTestExpectation 实现] 以获取登录用户。'

我的猜测是我的测试登录了用户并满足了对委托的期望,但是应用程序本身在启动时正在登录用户,因此“满足”被调用了两次。

我的测试如下:

func testLogInUser() {
   UserManager.loginDelegate = self
   expectation = expectation(description: "Did log in user")
   UserManager.logInUser(withEmail: "jacobo@viewer.com", password: "jacobo123")
   waitForExpectations(timeout: 10.0)
}

//Delegate Method
func didLogIn(user: User) {
    XCTAssertEqual(user.email, "jacobo@viewer.com")
    XCTAssertNotNil(user.uid)
    XCTAssertNotEqual(user.type, .guest)
    expectation?.fulfill() //Crashes here
}

因此,我正在寻找一种解决方案,既可以让我在不运行应用的情况下运行测试和 API 调用,也可以以某种方式避免被多次调用。

SO 中有一个答案建议在使用后将“期望”设置为 nil,但在我的情况下不起作用。还尝试将变量设置为弱。

【问题讨论】:

    标签: swift xcode xctest xctestexpectation


    【解决方案1】:

    您可以阻止正常的应用启动顺序发生。提供在启动应用程序进行测试时使用的不同应用程序委托。见https://qualitycoding.org/ios-app-delegate-testing/

    【讨论】: