如何测试没有数据写入NSPipe

时间:2016-07-03 13:23:45

标签: swift xctest nspipe

我最近一直致力于日志记录框架,并且我允许用户提供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()
    }
}

如果管道接收数据会导致测试失败,并且如果它没有通过测试,那么更好的方法是什么?

1 个答案:

答案 0 :(得分:0)

如评论中所述,我找到了一个单独的解决方案,它将任意数据写入管道,执行日志(可能会或可能不会导致更多数据写入管道),然后检索来自管道https://firebasestorage.googleapis.com/v0/b/bucket_name.appspot.com/o/filename?alt=media&token=token的数据。

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

availableData