目标 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 使用示例的主要内容,如果未能解决你的问题,请参考以下文章