【问题标题】:Swift: XCTest delegate/protocol call backs (Unit test)Swift:XCTest 委托/协议回调(单元测试)
【发布时间】:2017-09-24 13:17:49
【问题描述】:

我需要为委托/协议回调创建一些单元测试。这是我正在尝试测试的实现示例:

protocol SomethingWithNumbersDelegate: class {

    func somethingWithDelegate(results:Int)
}

class SomethingWithNumbers {
    var delegate: SomethingWithNumbersDelegate? = nil
    func doAsyncStuffWithNumbers(number:Int)  {

        var numbers = Int()
        /*
         doing some with the input
         */
        self.delegate?.somethingWithDelegate(results: numbers)
    }
}

我还没有找到一个创建单元测试 (XCTest) 来测试委托响应。

非常感谢您的帮助。

【问题讨论】:

    标签: ios swift xcode delegates xctest


    【解决方案1】:

    您可以为此使用XCTestExpectation 工具。例如:

    class NumbersTest: XCTestCase, SomethingWithNumbersDelegate {
    
        func testAsynchronousNumbers() {
            numbersExpectation = expectation(description: "Numbers")
    
            let numbers = SomethingWithNumbers()
            numbers.delegate = self
            numbers.doAsyncStuffWithNumbers(number: 123)
    
            // Waits 100 seconds for results.
            // Timeout is always treated as a test failure.
            waitForExpectations(timeout: 100)
            XCTAssertEqual(self.results, 456)
        }
    
        private var numbersExpectation: XCTestExpectation!
        private var results: Int!
    
        func somethingWithDelegate(results: Int) {
            self.results = results
            numbersExpectation.fulfill()
        }
    }
    

    expectations by Xcode 6 的引入使异步测试变得更加容易。期望是由XCTestCase 上的辅助方法创建的,例如:

    func expectation(description: String) -> XCTestExpectation
    

    创建并返回与测试用例关联的期望。


    更新。对于那些运行 Xcode 9 的用户,现在这是等待给定 XCTestExpectation 实例的首选习惯用法(即,而不是旧的 waitForExpectations 方法):

    wait(for: [numbersExpectation], timeout: 100)
    

    【讨论】:

    • 在这一行 "waitForExpectations(timeout: 10)"// 我收到这个错误:nsinternalinconsistencyexception api 违规调用等待而没有设置任何期望
    • @user2924482 您是否在开始时创建了numbersExpectation 对象?
    • 我修复了这个错误,但现在我收到了这个错误:异步等待失败超过了 10 的超时时间,预期未达到:“数字”
    • @user2924482 例如,将 timeout 参数从 10 秒增加到 100 秒。顺便说一句,我也更新了答案。
    • @YashBedi 因为这些属性仅在 NumbersTests 类内部需要,所以 private 用于限制仅对该类的使用。如果您创建 XCTestCase 的另一个子类,则不需要访问这些属性。没有其他类型可以访问这些属性,因此最好使用private
    猜你喜欢
    • 2010-11-07
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多