objective c 中的 XCTKVOExpectation 用法示例
XCTKVOExpectation usage example in objective c
我想在 objective c 中编写单元测试。为此,我需要 运行 仅当观察到的对象的键值变为预期值时才进行测试。
苹果文档没有详细解释实现。任何示例代码都会有很大帮助。
这是 Swift 中的一个示例实现,我希望它能向您展示如何使用 KVO 期望。
传递给期望的处理程序将两个对象作为输入(您正在观察的对象和一个变化字典)。它应该 return 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)
这里是一个如何使用 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/
我想在 objective c 中编写单元测试。为此,我需要 运行 仅当观察到的对象的键值变为预期值时才进行测试。
苹果文档没有详细解释实现。任何示例代码都会有很大帮助。
这是 Swift 中的一个示例实现,我希望它能向您展示如何使用 KVO 期望。
传递给期望的处理程序将两个对象作为输入(您正在观察的对象和一个变化字典)。它应该 return 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)
这里是一个如何使用 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/