Testing assertion in Swift

后端 未结 6 946
無奈伤痛
無奈伤痛 2020-12-14 07:39

I\'m writing unit tests for a method that has an assertion. The Swift Language guide recommends using assertions for \"invalid conditions\":

Assertion

6条回答
  •  执笔经年
    2020-12-14 08:13

    Agree with nschum's comment that it doesn't seem right to unit test assert because by default it wont be in the prod code. But if you really wanted to do it, here is the assert version for reference:

    override assert

    func assert(@autoclosure condition: () -> Bool, @autoclosure _ message: () -> String = "", file: StaticString = __FILE__, line: UInt = __LINE__) {
        assertClosure(condition(), message(), file, line)
    }
    var assertClosure: (Bool, String, StaticString, UInt) -> () = defaultAssertClosure
    let defaultAssertClosure = {Swift.assert($0, $1, file: $2, line: $3)}
    

    helper extension

    extension XCTestCase {
    
        func expectAssertFail(expectedMessage: String, testcase: () -> Void) {
            // arrange
            var wasCalled = false
            var assertionCondition: Bool? = nil
            var assertionMessage: String? = nil
            assertClosure = { condition, message, _, _ in
                assertionCondition = condition
                assertionMessage = message
                wasCalled = true
            }
    
            // act
            testcase()
    
            // assert
            XCTAssertTrue(wasCalled, "assert() was never called")
            XCTAssertFalse(assertionCondition!, "Expected false to be passed to the assert")
            XCTAssertEqual(assertionMessage, expectedMessage)
    
            // clean up
            assertClosure = defaultAssertClosure
        }
    }
    

提交回复
热议问题