到目前为止,我一直在开发一个日志记录框架,如果用户不想将日志消息发送到控制台,我将允许用户提供日志记录的NSPipe。
可以启用或禁用Logger,如果禁用,则不应通过管道发送任何数据。
在启用记录器时,很容易检查数据是否已发送到管道中,因为NSFileHandleDataAvailableNotification/readabilityHandler块立即包含数据,并触发availableData块。
但是,如果您要测试数据没有通过管道发送,并尝试应用availableData不包含任何数据的相同想法,则测试将超时,因为availableData仅在接收到数据后才返回。
我想出了一个解决方案,那就是监听通知,如果X秒后还没有收到通知,就满足没有收到通知的期望,前提是如果收到通知,该期望将被满足两次(导致测试失败)。
这种方法的问题是,如果由于某种原因,管道确实接收了一些数据,一旦在readabilityHandler块中满足了期望,测试就会立即成功,并且第二次不会满足期望:
func testDisabledLoggerDoesntLog() {
let logger = Logger()
let pipe = NSPipe()
logger.pipe = pipe
logger.enabled = false
let expectation = expectationWithDescription("handler not triggered")
logger.pipe!.fileHandleForReading.readabilityHandler = { handler in
expectation.fulfill()
}
logger.debug("Test message")
fulfillAfter(expectation, time: 2)
waitForExpectationsWithTimeout(3, handler: nil)
}
func fulfillAfter(expectation: XCTestExpectation, time: Double = 4) {
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(time * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
expectation.fulfill()
}
}如果管道接收到数据,会导致测试失败,而如果不接收数据,则会导致测试通过,那么哪种方法会更好呢?
https://stackoverflow.com/questions/38170368
复制相似问题