gpt4 book ai didi

swift - 如何测试没有数据写入 NSPipe

转载 作者:行者123 更新时间:2023-11-28 08:34:32 30 4
gpt4 key购买 nike

最近我一直在开发一个日志框架,我允许用户提供一个 NSPipe 来让日志下降,如果他们不希望日志消息转到控制台。

Logger 可以启用或禁用,禁用时,不应将任何数据发送到管道。

启用记录器后,很容易检查数据是否已通过管道发送,因为 availableData 立即包含数据,并且触发了 NSFileHandleDataAvailableNotification/readabilityHandler block 。

但是,如果您要测试数据未通过管道发送,并尝试应用 availableData 不包含任何数据的相同想法,则测试将超时为 availableData 仅在接收到数据后返回。

我想出了一个解决方案,就是监听通知,如果在 X 秒后还没有收到通知,则满足未收到通知的期望,前提是期望会如果收到通知,则执行两次(导致测试失败)。

这种方法的问题在于,如果由于某种原因,管道确实收到了一些数据,一旦在 readabilityHandler block 中满足预期,测试就会立即成功,而预期不会第二次实现:

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()
}
}

有什么更好的方法可以在管道接收到数据时导致测试失败,而在没有接收到数据时导致测试通过?

最佳答案

如评论中所述,我找到了一个单独的解决方案,该解决方案将任意数据写入管道,执行日志(这可能会或可能不会导致将更多数据写入管道),然后从中检索数据管道的 availableData

如果availableData的长度等于任意数据的长度,那么很明显日志还没有写入管道。否则如果长度大于测试写入的数据,则日志确实已经执行并将其数据写入管道。

let logger = Logger()
let pipe = NSPipe()

logger.pipe = pipe
logger.enabled = false
logger.useCurrentThread = true // The logs generally use a background thread to prevent interrupting the main queue. In this test, the current thread must be used in order for it to be synchronous.

let writtenData = "written data".dataUsingEncoding(NSUTF8StringEncoding)!
logger.pipe!.fileHandleForWriting.writeData(writtenData)

logger.debug("Test message")

XCTAssertEqual(logger.pipe!.fileHandleForReading.availableData.length, writtenData.length)

关于swift - 如何测试没有数据写入 NSPipe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38170368/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com