1

私は最近、ロギング フレームワークに取り組んでおり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()
    }
}

パイプがデータを受信した場合はテストに失敗し、そうでない場合はテストに合格するより良いアプローチは何でしょうか?

4

1 に答える 1

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)
于 2016-07-03T14:30:25.767 に答える