gpt4 book ai didi

ios - 如何使用异步调用对 @IBAction 进行单元测试

转载 作者:可可西里 更新时间:2023-11-01 01:37:47 24 4
gpt4 key购买 nike

在下面的代码中,我想测试是否调用了“DisplayHelper.displayAlert”。我正在依赖注入(inject) DisplayHelperAuthService 模拟对象,并使用 PromiseKit

在我的 View Controller 中:

@IBAction func submitButtonPressed(sender: AnyObject) {
AuthService.updateUser(["zipcode": self.zipcodeTextField.text!])
.then { user -> Void in
// sucess code
}.error { error -> Void in
self.DisplayHelper.displayAlert("Zipcode Not Found", message: "We can't find that zipcode... please try again.", callingViewController: self)
}
}

以下是无效的测试:

func testSubmitButtonServerCantFindZipcode() {
vc.zipcodeTextField.text = "00000"
vc.submitButtonPressed(self)

// called AuthService (passes)
XCTAssertEqual(authServiceMock.updateUserCalled, true)

// called displayAlert (fails because tests run before DisplayAlert is called)
XCTAssertEqual(displayHelperMock.displayAlertCalled, true)
}

如何让测试等待所有代码在断言之前执行?

最佳答案

使用 XCTest 测试异步代码时,您需要使用 XCTestExpectation .

您可以像这样重写测试代码:

let e = expectationWithDescription("display alert")
waitForExpectationsWithTimeout(3) { error in
XCTAssertEqual(displayHelperMock.displayAlertCalled, true)
}

现在使测试工作唯一缺少的部分是找到调用 expectation.fulfill() 的地方。最合适的位置是在您的 AuthService 模拟中,成功和失败回调运行之后。

不过,如果我能给你一些建议,编写断言某些方法是否已被调用的测试并不是一种安全的测试方法,因为你只是在测试实现而不是行为。

更好的方法是独立测试这两个组件。测试 AuthService 以确保成功和失败路径均按预期执行,并测试 DisplayHelper 以确保将警报 View 实际添加到 View 层次结构中。

This article可能是开始了解单元测试警报和 this post 的有用位置是一本关于为什么以及如何避免模拟的好读物。

关于ios - 如何使用异步调用对 @IBAction 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34254211/

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