Модульный тест продолжает давать сбой из-за порядка URLQueryItems - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть модульный тест, который проходит / не проходит случайным образом

func test_WhenRequestHasURLParams_CorrectlyEncodesParams() {
    sut.call(endpoint: MockEndpoint.endpointOne(paramOne: "foo", paramTwo: "bar")) { (response: MockResponse) in }
    XCTAssertEqual(mockURLSession.urlComponents?.percentEncodedQuery, "keyOne=4Plus5%3DNine&keyTwo=foo")
}

Это происходит потому, что порядок, в котором мой percentEncodedQuery постоянно меняется, когда я запускаю свои тесты.

У меня естькодер, который я использую как часть создания объекта запроса, в данном случае это

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

        if var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false), !parameters.isEmpty {
            urlComponents.queryItems = [URLQueryItem]()

            for (key, value) in parameters {
                let queryItem = URLQueryItem(name: key,value: "\(value)")
                urlComponents.queryItems?.append(queryItem)
            }
            urlRequest.url = urlComponents.url
        }

        if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil {
            urlRequest.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type")
        }
    }
}



public typealias Parameters = [String: Any]

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

public enum ParameterEncoding {
    case urlEncoding, jsonEncoding, urlAndJsonEncoding

    public func encode(urlRequest: inout URLRequest, bodyParams: Parameters?, urlParams: Parameters?) throws {
        do {
            switch self {
            case .urlEncoding:
                guard let urlParams = urlParams else { return }
                try URLParameterEncoder.encode(urlRequest: &urlRequest, with: urlParams)

            case .jsonEncoding:
                guard let bodyParams = bodyParams else { return }
                try JSONParameterEncoder.encode(urlRequest: &urlRequest, with: bodyParams)

            case .urlAndJsonEncoding:
                guard let bodyParams = bodyParams, let urlParams = urlParams else { return }
                try URLParameterEncoder.encode(urlRequest: &urlRequest, with: urlParams)
                try JSONParameterEncoder.encode(urlRequest: &urlRequest, with: bodyParams)
            }
        } catch {
            throw NSError(domain: "Could not encode request", code: 0, userInfo: nil)
        }
    }
}

Я не могу понять, почему порядок меняется

...