У меня есть простой класс обертки UrlSession для задач данных, которые так: < /p>
enum ApiHeaderAuth {
case basic(username: String, password: String)
case bearer(token: String)
var rawValue: String {
switch self {
case .basic(username: let username, password: let password):
guard let credentialData = "\(username):\(password)".data(using: .utf8) else {
return ""
}
let base64Credentials = credentialData.base64EncodedString()
return "Basic \(base64Credentials)"
case .bearer(let value):
return "Bearer \(value)"
}
}
}
typealias ApiResult = (Data, URLResponse)
protocol ApiClientable {
func get(path: String?, parameters: [String: Any]?, headers: [String: String]?, auth: ApiAuthHeader) async throws -> ApiResult
func post(_ data: Data, path: String?, parameters: [String: Any]?, headers: [String: String]?, auth: ApiAuthHeader) async throws -> ApiResult
func put(_ data: Data, path: String?, parameters: [String: Any]?, headers: [String: String]?, auth: ApiAuthHeader) async throws -> ApiResult
func patch(_ data: Data, path: String?, parameters: [String: Any]?, headers: [String: String]?, auth: ApiAuthHeader) async throws -> ApiResult
func delete(path: String?, parameters: [String: Any]?, headers: [String: String]?, auth: ApiAuthHeader) async throws -> ApiResult
}
class ApiClient: ApiClientable {
private let session: URLSession
private let hostString: String
init(sessionProvider: @escaping () -> URLSession = { URLSession.shared }, hostProvider: @escaping () -> String) {
self.session = sessionProvider()
self.hostString = hostProvider()
}
func get(path: String?, parameters: [String: Any]?, headers: [String: String]?, auth: ApiAuthHeader) async throws -> ApiResult {
let queries = parameters?.reduce("?") {
"\($0)\($1.key)=\($1.value)&"
}.dropLast()
if let url = URL(string: "\(hostString)\(path ?? "")\(queries ?? "")") {
let request = URLRequest(url: url)
request.httpMethod = HTTPMethod.get.rawValue
request.allHTTPHeaderFields = headers.merging(["Authorization": auth.rawValue], uniquingKeysWith: { (_, new) in new })
return try await session.data(for: request)
} else {
throw(ApiClientError.invalidURL)
}
}
}
< /code>
У меня есть комплекс интеграционных тестов с использованием Swift Testing, который будет проверять это на реальном URL -адресе для тестирования. Как так: < /p>
struct ApiClientIntegrationTests {
@Test func get() async throws {
let host = "https://developer.apple.com"
let sut = ApiClient(hostProvider: { host })
await #expect(throws: Never.self) {
let (data, response) = try await sut.get(path: "/documentation/testing", parameters: nil, headers: [:])
print(String(data: data, encoding: .utf8) ?? "No data")
#expect(data.count > 0)
#expect(response is HTTPURLResponse)
}
}
}
< /code>
Теперь тест всегда зеленый, потому что ожидаемая задача данных еще не выполнена, но тест был завершен. Как мне дождаться завершения данных? Я знаю, как это сделать, - это xctest, используя ожидание, ожидая его в основном органе теста и выполняет его, когда задача данных возвращает значение. Но как это сделать в Swift Testing? Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/797 ... ft-testing
Интеграционное тестирование с использованием тестирования асинк-аваита и быстрого ⇐ IOS
Программируем под IOS
1753251863
Anonymous
У меня есть простой класс обертки UrlSession для задач данных, которые так: < /p>
enum ApiHeaderAuth {
case basic(username: String, password: String)
case bearer(token: String)
var rawValue: String {
switch self {
case .basic(username: let username, password: let password):
guard let credentialData = "\(username):\(password)".data(using: .utf8) else {
return ""
}
let base64Credentials = credentialData.base64EncodedString()
return "Basic \(base64Credentials)"
case .bearer(let value):
return "Bearer \(value)"
}
}
}
typealias ApiResult = (Data, URLResponse)
protocol ApiClientable {
func get(path: String?, parameters: [String: Any]?, headers: [String: String]?, auth: ApiAuthHeader) async throws -> ApiResult
func post(_ data: Data, path: String?, parameters: [String: Any]?, headers: [String: String]?, auth: ApiAuthHeader) async throws -> ApiResult
func put(_ data: Data, path: String?, parameters: [String: Any]?, headers: [String: String]?, auth: ApiAuthHeader) async throws -> ApiResult
func patch(_ data: Data, path: String?, parameters: [String: Any]?, headers: [String: String]?, auth: ApiAuthHeader) async throws -> ApiResult
func delete(path: String?, parameters: [String: Any]?, headers: [String: String]?, auth: ApiAuthHeader) async throws -> ApiResult
}
class ApiClient: ApiClientable {
private let session: URLSession
private let hostString: String
init(sessionProvider: @escaping () -> URLSession = { URLSession.shared }, hostProvider: @escaping () -> String) {
self.session = sessionProvider()
self.hostString = hostProvider()
}
func get(path: String?, parameters: [String: Any]?, headers: [String: String]?, auth: ApiAuthHeader) async throws -> ApiResult {
let queries = parameters?.reduce("?") {
"\($0)\($1.key)=\($1.value)&"
}.dropLast()
if let url = URL(string: "\(hostString)\(path ?? "")\(queries ?? "")") {
let request = URLRequest(url: url)
request.httpMethod = HTTPMethod.get.rawValue
request.allHTTPHeaderFields = headers.merging(["Authorization": auth.rawValue], uniquingKeysWith: { (_, new) in new })
return try await session.data(for: request)
} else {
throw(ApiClientError.invalidURL)
}
}
}
< /code>
У меня есть комплекс интеграционных тестов с использованием Swift Testing, который будет проверять это на реальном URL -адресе для тестирования. Как так: < /p>
struct ApiClientIntegrationTests {
@Test func get() async throws {
let host = "https://developer.apple.com"
let sut = ApiClient(hostProvider: { host })
await #expect(throws: Never.self) {
let (data, response) = try await sut.get(path: "/documentation/testing", parameters: nil, headers: [:])
print(String(data: data, encoding: .utf8) ?? "No data")
#expect(data.count > 0)
#expect(response is HTTPURLResponse)
}
}
}
< /code>
Теперь тест всегда зеленый, потому что ожидаемая задача данных еще не выполнена, но тест был завершен. Как мне дождаться завершения данных? Я знаю, как это сделать, - это xctest, используя ожидание, ожидая его в основном органе теста и выполняет его, когда задача данных возвращает значение. Но как это сделать в Swift Testing? Спасибо.
Подробнее здесь: [url]https://stackoverflow.com/questions/79711325/integration-testing-using-async-await-and-swift-testing[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия