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

时间:2016-07-30 14:49:04

标签: ios swift unit-testing automated-tests xctest

我正在开发testing framework for iOS development。我也希望这个测试框架能够经过充分测试。问题是,我无法弄清楚如何为我的测试目标编写测试,断言我的框架正确导致测试失败。如果我创建了一个失败的测试,我反过来导致测试失败(我知道,它令人困惑)。

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

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

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

但是我需要一种方法来验证MTKAssertNoBrokenConstraints 将标记为测试为失败,而实际上并未将此测试标记为失败。

我已经研究过创建一个符合XCTestObservation的自定义对象,但到目前为止,我只能进行无限递归。我不确定这是否是正确的路径,或者解决无限递归实际上是否会让我到达我需要的位置。

1 个答案:

答案 0 :(得分:1)

以下测试拦截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)\"")
    }

}