如何为自定义 XCTest 断言编写自动化测试?

How can I write automated tests for custom XCTest assertions?

我正在开发 testing framework for iOS development。我也希望这个测试框架能够得到很好的测试。问题是,我不知道如何为我的测试目标编写一个测试来断言我的框架正确地导致了失败的测试。如果我创建了一个失败的测试,我反过来导致了测试失败(我知道,这很混乱)。

考虑一个例子。我的框架的一部分包括验证特定代码片段没有任何破坏约束的功能。

MTKAssertNoBrokenConstraints {
    // UI code that might break some constraints
}

我已经手动测试了这个以验证当没有破坏约束时,断言通过,但是当有破坏约束时,它正确地将测试标记为失败。

但我需要一种方法来验证 MTKAssertNoBrokenConstraints 将测试标记为失败 而不会实际将测试本身标记为失败。

我研究过创建一个符合 XCTestObservation 的自定义对象,但到目前为止,我只得到了无限递归。我不确定这是否是正确的路径,或者解决无限递归是否真的能让我到达我需要去的地方。

以下测试拦截了 XCTFail("FOO") 的失败,然后针对失败执行一些检查。

class TestTheTests: XCTestCase {

    var interceptFailure = false
    var failureCount = 0
    var failureDescription = ""
    var failureFilePath = ""
    var failureLineNumber: UInt = 0
    var failureExpected = false

    override func recordFailureWithDescription(description: String, inFile filePath: String, atLine lineNumber: UInt, expected: Bool) {
        if !interceptFailure {
            super.recordFailureWithDescription(description, inFile: filePath, atLine: lineNumber, expected: expected)
        } else {
            failureCount += 1
            failureDescription = description
            failureFilePath = filePath
            failureLineNumber = lineNumber
            failureExpected = expected
        }
    }

    func testExample() {
        interceptFailure = true
        XCTFail("FOO")
        interceptFailure = false

        XCTAssertEqual(failureCount, 1)
        XCTAssertTrue(failureDescription.hasSuffix("FOO"), "Was \"\(failureDescription)\"")
    }

}