目标 c 中的 XCTKVOExpectation 使用示例

Posted

技术标签:

【中文标题】目标 c 中的 XCTKVOExpectation 使用示例【英文标题】:XCTKVOExpectation usage example in objective c 【发布时间】:2018-09-04 19:38:57 【问题描述】:

我想在目标 c 中编写单元测试。为此,我只需要在观察对象的键值变为预期值时运行测试。

苹果文档没有详细解释实现。任何示例代码都会有很大帮助。

【问题讨论】:

【参考方案1】:

这是 Swift 中的一个示例实现,我希望它向您展示如何使用 KVO 期望。

传递给期望的处理程序将两个对象作为输入(您正在观察的对象和更改字典)。如果您对值已按预期更改感到满意,则应返回 true,如果未满足预期,则应返回 false

class Person: NSObject 
    @objc dynamic var name: String

    init(name: String) 
        self.name = name
    

    func changeName(to newName: String) 
        name = newName
    


class Tests: XCTestCase 
    func testNameValueChangedWhenChangeNameCalled() 
        let person = Person(name: "Alice")
        let newName = "Bob"
        keyValueObservingExpectation(for: person, keyPath: "name", handler:  (observedObject, change) in
            // `observedObject` is of type `Any` so it needs to be cast as the correct type before proceeding
            guard let observedObject = observedObject as? Person else 
                // Don't fulfill the expectation
                return false
            
            // Check the current name is the name we expect
            return observedObject.name == newName
        )
        person.changeName(to: newName)
        waitForExpectations(timeout: 1, handler: nil)
    

您也可以直接初始化XCTKVOExpectation 并使用XCTWaiter 来处理更精细的结果。

let person = Person(name: "Alice")
let newName = "Bob"
let expectation = XCTKVOExpectation(keyPath: "name", object: person)
expectation.handler =  (observedObject, change) in
    guard let observedObject = observedObject as? Person else 
        return false
    
    return observedObject.name == newName

person.changeName(to: newName)
let result = XCTWaiter().wait(for: [expectation], timeout: 1)
XCTAssertEqual(result, .completed)

【讨论】:

谢谢!我使用的是正常的期望并且需要这个,但是没有太多关于这个的文档。工作正是我需要的。您还可以返回 true 或 false 来告诉期望处理程序来满足期望。【参考方案2】:

这里是一个如何使用keyValueObservingExpectation的例子:

let testClass = MyViewController()
let expectation = keyValueObservingExpectation(for: testClass, keyPath: #keyPath(MyViewController.urlString))
wait(for: [expectation], timeout: 10)

要使用它,您必须使用 #keyPath(MyViewController.urlString) 指定 keyPath。在该代码中,正在观察 urlString 的值。

这是https://www.rockhoppertech.com/blog/kvo-quick-spec-unit-tests/的另一个例子

【讨论】:

以上是关于目标 c 中的 XCTKVOExpectation 使用示例的主要内容,如果未能解决你的问题,请参考以下文章

firebase 中的 swift 代码等效于目标 c

iOS目标C中的多线程

如何访问目标 c 中的数组值?

目标 c 中的异常传播

如何在目标 c 中使用步进器缩放 UitextView 中的文本

IOS项目目标中的多个Objective C桥接头