代码之家  ›  专栏  ›  技术社区  ›  ekscrypto

如何在代码覆盖率为100%的Xcode单元测试中编写do{}catch{}

  •  1
  • ekscrypto  · 技术社区  · 6 年前

    考虑到这段代码:

    func testUrlRequest_WithAuthenticationNoToken_ExpectingAuthenticationFailure() {
            let mockController = MockAuthenticationController()
            mockController.token = nil
            Server.authenticationController = mockController
            do {
                _ = try Server.urlRequestWithHeaders(to: arbitraryEndpoint, excludeBearerToken: false)
                XCTFail("Expected throw when no token is present")
            } catch {
                XCTAssertEqual(error as? Server.Errors, .authenticationFailure)
            }
        }
    

    xcode code coverage not 100%

    有没有什么方法可以正确地告诉Xcode,代码路径绝对不应该被占用,因此就代码覆盖率而言可以忽略它?或者,当您需要单元测试异常生成时,是否有更好的模式可以遵循?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ian MacDonald    6 年前

    正如在注释中提到的,您应该期望您的单元测试代码没有完全覆盖;特别是对于 XCTFail 电话。单元测试的全部目标是 .

    即使你重组了你的源头 在其他地方,你仍然打算让它永远不会被执行。通过使用 XCTAssertEqual 再一次。

    func testUrlRequest_WithAuthenticationNoToken_ExpectingAuthenticationFailure() {
        let mockController = MockAuthenticationController()
        mockController.token = nil
        Server.authenticationController = mockController
        var failed = false
        do {
            _ = try Server.urlRequestWithHeaders(to: arbitraryEndpoint, excludeBearerToken: false)
        } catch {
            XCTAssertEqual(error as? Server.Errors, .authenticationFailure)
            failed = true
        }
        XCTAssertEqual(failed, true, "Expected throw when no token is present")
    }