我最近一直致力于日志记录框架,并且我允许用户提供NSPipe
日志,如果他们不想要日志的话记录要发送到控制台的消息。
可以启用或禁用Logger
,禁用时,不应该向管道发送任何数据。
在启用记录器时,检查数据是否已通过管道发送是很容易的,因为availableData
会立即包含数据,并且会触发NSFileHandleDataAvailableNotification / readabilityHandler块。
但是,如果您要测试数据是否未通过管道发送,并尝试应用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()
}
}
如果管道接收数据会导致测试失败,并且如果它没有通过测试,那么更好的方法是什么?
答案 0 :(得分:0)
如评论中所述,我找到了一个单独的解决方案,它将任意数据写入管道,执行日志(可能会或可能不会导致更多数据写入管道),然后检索来自管道https://firebasestorage.googleapis.com/v0/b/bucket_name.appspot.com/o/filename?alt=media&token=token
的数据。
如果availableData
的长度等于任意数据的长度,则很明显日志尚未写入管道。否则,如果长度大于测试写入的数据,则确实已执行日志并将其数据写入管道。
availableData