Как сделать XCTAssertEqual на ответ Alamofire? - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь выполнить модульное тестирование для моего API с Alamofire в качестве остальной среды.Я добавил зависимости pod и все в Podfile, и нет ошибок относительно отсутствующих модулей или чего-то еще.В настоящее время в качестве примера я пытаюсь попасть на главную страницу Google, и в ответ я пытаюсь оценить код ответа с помощью XCRAssertEqual .Функция работает нормально, если я использую в контроллере представления, но она не работает в тестовом классе.Не работая, я имел в виду, что он дает true для обоих случаев, поскольку оба кода ответа равны .success и .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, но второй раз никогда не терпит неудачу.

1 Ответ

0 голосов
/ 24 августа 2018

Хотя я знаю, что запросы 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)
    }
}
...