Tengo la siguiente clase de prueba, que obtiene datos del servidor remoto e intentando verificarlo para nil:

import XCTest
@testable import DogYears

class DogYearsUnitTests: XCTestCase {
    var resData: Data? = nil

  func testInfoLoading(){

    let url = "https://raw.githubusercontent.com/FahimF/Test/master/DogYears-Info.rtf"
    HTTPClient.shared.get(url: url) { (data, error) in
      XCTAssertNil(error)
      XCTAssertNotNil(data)
        self.resData = data
    }

    let predicate = NSPredicate(format: "resData != nil")
    let exp = expectation(for: predicate, evaluatedWith: self, handler: nil)
    let res = XCTWaiter.wait(for: [exp], timeout: 5.0)
    if res == XCTWaiter.Result.completed {
      XCTAssertNotNil(resData, "No data recieved from server for InfoView content")
    } else {
      XCTAssert(false)
    }

  }
}

Funciona, pero me pregunto por qué el nspredicate no funciona. Ver, cambiando let predicate = NSPredicate(format: "resData != nil") a let predicate = NSPredicate(format: "resData == nil") no tiene efecto, y la prueba aún pasa, ¿por qué se pasa incluso para este let predicate = NSPredicate(format: "resData == nil")?

2
Evgeniy Kleban 30 jun. 2019 a las 13:24

1 respuesta

La mejor respuesta

Prueba aprobada con alquiler predicate = NSPredicate(format: "resData == nil") porque es cierto en principio, tan pronto como la solicitud no se realiza simultáneamente) y su temporizador no lo ayuda. Y también se pasa con let predicate = NSPredicate(format: "resData != nil") Temporizador de debido temporizador, su solicitud tiene tiempo para recuperar los datos.

Aquí está el ejemplo simple: https://developer.apple.com/documentation/xctest/ asynchronous_tests_and_expectations / testing_asynchronous_operations_with_expectations

Puede reescribir su prueba como esta, donde en lugar de su solicitud ejecuto un código en otro hilo, creo que es más fácil de leer:

class DogYearsUnitTests: XCTestCase {

    var resData: Data? = nil

    func testInfoLoading(){

        let expectation = XCTestExpectation(description: "Download apple.com home page")

        DispatchQueue.global().async {
            Thread.sleep(forTimeInterval: 3)
            self.resData = Data()
            expectation.fulfill()
        }

        // Wait until the expectation is fulfilled, with a timeout of 10 seconds.
        wait(for: [expectation], timeout: 10.0)
        XCTAssertNotNil(resData)

    }
}
1
Andrew 30 jun. 2019 a las 12:32