【问题标题】:keyValueObservingExpectationForObject handler block not called未调用 keyValueObservingExpectationForObject 处理程序块
【发布时间】:2016-06-25 01:41:32
【问题描述】:

我在 Swift 中有一个测试用例,试图等待属性更改:

    import XCTest

class AsynchronyousKVOTests: XCTestCase {

    let testedObject : TestedObjet = TestedObjet.init()

    func testKeyValueObservingExpectationForObject() {

        // 1st approach, fails:
        keyValueObservingExpectationForObject(self.testedObject, keyPath: "testedProperty") { object, changes in

            return true // Breakpoint never reached!
        }

        // 2nd approach, also fails:
        keyValueObservingExpectationForObject(self.testedObject, keyPath: "testedProperty", expectedValue: "After")

        self.testedObject.updateTestedPropertyAsynchronyously("After")
        // Expectation not fullfilled
        waitForExpectationsWithTimeout(2, handler: nil)
    }
}

class TestedObjet : NSObject {

    var testedProperty : NSString = "Before"

    func updateTestedPropertyAsynchronyously(value: NSString) {

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
            sleep(1)
            dispatch_sync(dispatch_get_main_queue(), {
                self.testedProperty = value
        })
        })
    }

}

为什么永远不会调用testKeyValueObservingExpectationForObject 处理程序块?

【问题讨论】:

    标签: swift unit-testing xctest xctestexpectation xctestcase


    【解决方案1】:

    您必须在 Swift 中使用 dynamic 关键字启用键值观察:

    dynamic var testedProperty: NSString = "Before"
    

    【讨论】:

    • 有趣的是,Objective-C 属性不需要 ''dynamic' 关键字。
    • 我怀疑可观察是昂贵的(覆盖设置和获取)。因此,明确表示对性能有好处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2021-03-18
    • 1970-01-01
    相关资源
    最近更新 更多