Тест возвращает «Тип выражения неоднозначный без контекста» для функции, которая выдает - PullRequest
0 голосов
/ 26 декабря 2018

Я пишу сетевой уровень, следуя подходу TDD.

У меня есть структура, которую я буду использовать для кодирования любых параметров в моем запросе.

Я хотел бы заявить, чтоесли при вызове этого кодировщика отсутствует URL / nil, выдается правильная ошибка.

struct URLParameterEncoder: ParameterEncoder {
    static func encode(urlRequest: inout URLRequest, with parameters: Parameters) throws {
        guard let url = urlRequest.url else { throw NetworkError.missingURL }
    }
}

Я написал тест и передал URL, который, по моему мнению, должен соответствовать этому тесту, однако получаю ошибкупри попытке запустить тест.

class URLParameterEncoderTests: XCTestCase {
    var sut: URLParameterEncoder!

    override func setUp() {
        sut = URLParameterEncoder()
    }

    func test_Encode_ThrowsMissingURLError_WhenURLIsNil() {
        let request = URLRequest(url: URL(string: "")!)
        let params: Parameters = [:]

        XCTAssertThrowsError(try sut.encode(urlRequest: &request, with: params)) { error in
            XCTAssertEqual(error as? NetworkError, NetworkError.missingURL)
        }
    }
}

В моем XCTAssertThrowsError я получаю Type of expression is ambiguous without more context, который, по моему мнению, срабатывает около sut.encode

Дополнительный код, необходимый для репликации

public typealias Parameters = [String: Any]

public protocol ParameterEncoder {
    static func encode(urlRequest: inout URLRequest, with parameters: Parameters) throws
}

public enum NetworkError: String, Error {
    case paramsAreNil = "Missing params"
    case encodingFailed = "Could not encode params"
    case missingURL = "Request URL is missing"
}

1 Ответ

0 голосов
/ 26 декабря 2018

После добавления больше контекста - вопросительный знак для необязательного связывания, потому что sut по-прежнему является необязательным -

XCTAssertThrowsError(try sut?.encode(urlRequest: &request, with: params)) { error in ...

вы получите реальную ошибку

Статический член 'кодировать' нельзя использовать для экземпляра типа 'URLParameterEncoder'

Это означает, что encode должен вызываться для типа URLParameterEncoder.encode(...


Однако возникает новая ошибка

Невозможно передать неизменяемое значение в качестве аргумента inout: 'request' - это константа 'let'

Это означает, что параметр inout похож на request должно быть объявлено как переменная: var request = ...

...