我一直在研究最近的日誌框架,並且我允許用戶爲日誌提供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()
}
}
什麼將一個更好的辦法是,如果管道接收數據,並通過的測試,如果它不,這將導致一個失敗的測試?
怎麼樣在文件處理程序中調用'readDataOfLength(1)'?你能期待拋出異常嗎? –
@AaronBrager不幸的是readDataOfLength沒有通過。像'availableData'一樣,它是同步的並且在返回之前等待接收至少指定長度的數據。 –
@AaronBrager我可以嘗試將特定長度的數據寫入測試中的管道,記錄一些數據並檢查可用數據的長度是否等於我自己寫的數據的長度? –