Как XCTAssertEqual на ответ Alamofire?

Я пытаюсь провести модульное тестирование своего API с Alamofire в качестве остальной структуры. Я добавил зависимости модулей и все, что есть в файле Podfile, и нет ошибок в отношении отсутствующих модулей или чего-то еще. В настоящее время в качестве примера я пытаюсь перейти на домашнюю страницу Google и при ответе пытаюсь оценить код ответа с помощью XCRAssertEqual. Функция работает нормально, если я использую контроллер представления, но он не работает в тестовом классе. Под неработающим я имел в виду, что он дает истинный для обоих случаев, поскольку оба кода ответа равны .успех и .filure. В чем может быть причина этого? Ниже мой TestClass, в котором определена функция, и класс тестового примера, в котором она используется.

import Foundation
import Alamofire

class TestingClass {

    private init(){

    }

    static let sharedInstance = TestingClass()

    func getSquare(number:Int)->Int{
        return number * number
    }

    func getGoogleResponse(completion:@escaping (_ rest:Int)->Void){

        Alamofire.request("https://google.com").responseString { response in
            var result = -1
            switch response.result {
            case .success:
                result = 0
            case .failure(let error):
                result = 1
            }
            completion(result)
        }

    }

}

класс тестового случая

import XCTest
@testable import MyApp

class MyAppTests: XCTestCase {

    func testSquare(){
        XCTAssertEqual(TestingClass.sharedInstance.getSquare(number:2),6)
    }

    func testGoogle(){
        TestingClass.sharedInstance.getGoogleResponse { (res) in
            print("ANURAN \(res)")
            XCTAssertEqual(res, 0)
        }
    }
}

Первый тестовый пример работает нормально, поскольку он не имеет ничего общего с Alamofire, но второй раз никогда не дает сбоев.

Это потому, что Alamofire.request асинхронный

Pranav Kasetti 24.08.2018 14:55

да, просто прочтите это. Придется использовать ожидания. Спасибо за комментарий

Anuran Barman 24.08.2018 14:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
515
1

Ответы 1

Хотя я знаю, что запросы Alamofire являются асинхронными, мне не приходило в голову, что он может провалить и мой тестовый пример. Итак, что вам нужно сделать, это дождаться ответа. Для этого вам нужно использовать ожидание, который поставляется с XCTestCase. Итак, переписанный код будет таким:

import XCTest
@testable import MyApp

class MyAppTests: XCTestCase {

    func testSquare(){
        XCTAssertEqual(TestingClass.sharedInstance.getSquare(number:2),6)
    }

    func testGoogle(){
        let expectation = self.expectation(description: "Hitting Google")
        var result:Int?
        TestingClass.sharedInstance.getGoogleResponse { (res) in
            print("ANURAN \(res)")
            result=res
            expectation.fulfill()
        }
        wait(for: [expectation], timeout: 30)
        XCTAssertEqual(result!, 1)
    }
}

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