私は最近、ロギング フレームワークに取り組んでおりNSPipe
、ログ メッセージをコンソールに表示したくない場合は、ユーザーがログを停止するように指定できるようにしています。
はLogger
有効または無効にすることができ、無効にするとパイプにデータを送信しません。
ロガーが有効になっているときにデータがパイプに送信されたかどうかを確認するのは簡単です。これは、availableData
すぐにデータが含まれ、NSFileHandleDataAvailableNotification/readabilityHandler ブロックがトリガーされるためです。
ただし、データがパイプに送信されていないことをテストし、データを含まない同じアイデアを適用しようとすると、データが受信された後にのみ返さavailableData
れるため、テストはタイムアウトします。availableData
通知をリッスンするという1つの解決策を思いつきました。X秒後に通知が受信されない場合は、通知が受信されていないという期待を満たし、期待が2回満たされることを前提としています(テストが失敗する原因となります) 通知が受信された場合。
このアプローチの問題は、何らかの理由でパイプが何らかのデータを受信した場合、readabilityHandler
ブロックで期待が満たされると、テストはすぐに成功し、期待が2度目には満たされないことです。
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()
}
}
パイプがデータを受信した場合はテストに失敗し、そうでない場合はテストに合格するより良いアプローチは何でしょうか?