2016-07-03 28 views
1

我一直在研究最近的日誌框架,並且我允許用戶爲日誌提供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() 
    } 
} 

什麼將一個更好的辦法是,如果管道接收數據,並通過的測試,如果它不,這將導致一個失敗的測試?

+0

怎麼樣在文件處理程序中調用'readDataOfLength(1)'?你能期待拋出異常嗎? –

+0

@AaronBrager不幸的是readDataOfLength沒有通過。像'availableData'一樣,它是同步的並且在返回之前等待接收至少指定長度的數據。 –

+0

@AaronBrager我可以嘗試將特定長度的數據寫入測試中的管道,記錄一些數據並檢查可用數據的長度是否等於我自己寫的數據的長度? –

回答

0

正如評論所述,我發現了一個單獨的解決方案,它將任意數據寫入管道,執行日誌(可能會導致更多數據寫入管道),然後檢索數據從管道的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) 
相關問題