Тест возвращает "Тип выражения неоднозначный без контекста" для функции, которая выдает

Я пишу сетевой уровень, следуя подходу 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 ответ

Решение

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

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

вы получаете настоящую ошибку

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

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


Однако это вызывает новую ошибку

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

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

Другие вопросы по тегам