HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 调用异步方法的方法的单元测试大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想我有这些代码行:
func reset() {
    initializeAnythingElse() {
        // AnythingElse
    }

    initializeHomeData() {
        // HomeData
    }
}

func initializeHomeData(callBACk: @escaping (()-> Void)) {
    getHomeConfig() {
        callBACk()
    }
}

func initializeAnythingElse(callBACk: @escaping (()-> Void)) {
    getAnythingElse() {
        callBACk()
    }
}

我想为该代码编写一个单元测试.对于initializeHomeData和initializeAnythingElse,我可以编写单元测试,如:

func tesTinitializeHomeData() {
    let successExpectation = expectation(description: "")

    sut.initializeHomeData {
        successExpectation.fulfill()
    }

    waitForExpectations(timeout: 1.0,handler: nil)

    // Validation goes here
}

func tesTinitializeAnythingElse() {
    let successExpectation = expectation(description: "")

    sut.initializeAnythingElse {
        successExpectation.fulfill()
    }

    waitForExpectations(timeout: 1.0,handler: nil)

    // Validation goes here
}

我的问题是,如何测试reset()?我应该在testReset()中调用它们,如:

func testReset() {
    tesTinitializeHomeData()
    tesTinitializeAnythingElse()
}

但我认为这不是适当的实施.

解决方法

你是对的.要测试重置,您需要调用reset,而不是内部方法.

这么说,重置目前的编写方式使其不可测试.您能够如此轻松地测试其他独立方法的原因是因为回调参数都接受了.

我建议你重写重置以允许两个可选的回调,如下所示:

typealias CallBACk = () -> ()

func reset(
    homeDataCallBACk: @escaping CallBACk? = nil,anythingElseCallBACk: @escaping CallBACk? = nil) {
    initializeAnythingElse() {
       anythingElseCallBACk?()
    }
    initializeHomeData() {
       homeDataCallBACk?()
    }
}

请注意,此更改允许您在异步时通知这两个内部调用是否完成.

现在,您的测试方法需要在编写时虑某种同步原语,因为从逻辑上讲,只有当主数据和其他任何内容都完成并且调用了它们的回调时,才能完成重置.

有很多方法可以实现这一点,但我将向您展示一种信号量方法

func testReset() {

    let expectation = expectation(description: "reset() completes within some duration")

    // some mechanism to synchronize concurrent tasks
    // I am using a semaphore
    let s = DispatchSemaphore(value: 0)

    let homeCallBACk: CallBACk =  {
        s.signal() // signals the completion of home data init
    }

    let anythingElseCallBACk: CallBACk = {
        s.signal() // signals the completions of anything else setup
    }

    // call your reset method as part of the test
    reset(homeDataCallBACk: homeCallBACk,anythingElseCallBACk: anythingElseCallBACk)

    // we kNow we need to wait for two things to complete
    // init home data and anything else,so do that
    s.wait()
    s.wait()

    // at this step,reset's internal async methods
    // have completed so we can Now
    // fulfill the expectation
    expectation.fulfill()

}

请注意,所有这些更改都是纯粹允许您测试重置调用所必需的.函数签名允许您在现有代码中将reset()写为current,因为它具有可选参数,认值都设置为nil.

大佬总结

以上是大佬教程为你收集整理的ios – 调用异步方法的方法的单元测试全部内容,希望文章能够帮你解决ios – 调用异步方法的方法的单元测试所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。