Как написать do {} catch {} в модульном тесте Xcode со 100% охватом кода - PullRequest
0 голосов
/ 06 сентября 2018

Я относительно новичок в модульном тестировании и надеюсь достичь максимально возможного покрытия кода, шаблон do {} catch {} доставляет мне горе, пытаясь достичь этой цели.

Учитывая этот кусок кода:

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)
        }
    }

Метод Server.urlRequestwithHeaders () правильно генерирует ошибку, которая перехватывается блоком catch {}, но Xcode дает мне такой результат для покрытия кода:

xcode code coverage not 100%

Кажется, у него есть две проблемы: сначала предупреждение о том, что XCTFail () никогда не будет выполнено (предупреждение с пунктирной красной линией), затем красное покрытие 0, соответствующее последнему "}" в коде, поэтому я предполагаю, что это какое-то авто сгенерированный код возврата, который никогда не выполняется.

Есть ли способ правильно сказать XCode, что путь к коду совершенно не ожидается, и поэтому игнорировать его в части покрытия кода? Или есть лучший шаблон для генерации исключений в модульном тесте?

1 Ответ

0 голосов
/ 06 сентября 2018

Как уже упоминалось в комментариях, вы должны ожидать, что ваш код модульного теста не будет иметь полного покрытия; особенно для звонков XCTFail. Вся цель юнит-теста состоит в том, чтобы никогда не попадал в эту строку .

Даже если вы реструктурировали свой источник, чтобы перенести 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")
}
...