Saturday 25 November 2017

Espera Las Expectativas Con Timeout Crashing


Estoy tratando de probar una solicitud asincrónica con XCTest y por lo tanto utilizando expectationWithDescription. Sin embargo, cuando waitForExpectationsWithTimeout se llama inmediatamente se bloquea sin esperar el tiempo de espera. Incluso he intentado poner la operación de cumplimiento poco después de excluir un problema de tiempo de espera, pero no cambia nada de cosas esta es mi función: El mismo comportamiento sucede en otras funciones. Si me quito la operación waitForExpectationsWithTimeout y mantener la operación de expectationWithDescription, se bloquea al final de la función. En ambos casos el repot de choque es el siguiente: Ask Jul 22 15 at 12: 21Swift tiene problemas especiales para mostrar el punto de ruptura de excepción correcto cuando los cierres están presentes en el mismo alcance. He visto el mismo problema en un XCTestCase que utiliza dispatchafter e incluso a través del punto de interrupción de excepción era la misma línea que waitForExpectationsWithTimeout el caso de prueba se estrellaba debido a un downcast en un objeto nil. Sé que este no es su caso, pero cuando esto sucede sugiero eliminar las declaraciones de una línea a la vez y ejecutar la prueba después de cada eliminación. Si la prueba no se bloquea, usted ha identificado al culpable. Esta es desafortunadamente la mejor opción en el momento de esta escritura cada vez que Swift muestra un punto de interrupción de excepción en una línea que no tiene sentido, especialmente la infame línea 0 de una clase que podría ver en las herramientas de informes de fallos. Déjenos saber si usted ha descubierto su accidente. XCTestExpectation Gotchas XCTestExpectation simplifica la prueba del código de callback-estilo, pero algunas de sus opciones de diseño hacen que las pruebas sean frágiles a menos que theyrsquore mitiguen: explota si todo funciona bien pero más tarde de lo esperado. Estalla si todo funciona bien más de una vez. Este artículo presenta dos mitigaciones concretas: Use referencias débiles para asegurar que la expectativa muera antes de que pueda causarle problemas. Utilice un API de promesa diferente para hacer su espera. Una revisión rápida XCTestExpectation es la herramienta Applersquos marco de prueba de unidad XCTest proporciona para hacer frente a las API asíncronas. Para usarlo, solicita al caso de prueba que cree uno o más: espere un tiempo configurable para que cada expectativa pendiente se llene: y Registrar un error de prueba si el tiempo se agota antes de que suceda: Espera asíncrona falló: Excedido el tiempo de espera de 1 segundos, con expectativas no cumplidas: ldquoitrsquoll suceder, merdquo confianza. Hubiera tenido éxito si hubiera sido llenado en el tiempo: Desplazamos otra aserción en XCTest: Terminar la aplicación debido a una excepción no detectada lsquoNSInternalInconsistencyExceptionrsquo, reason: lsquoAPI violation - múltiples llamadas realizadas a - XCTestExpectation cumplen para llamadas back. rsquo Esto probablemente indica una Error real en el código que llama a la devolución de llamada la mayor parte del tiempo, pero si doesnrsquot, yoursquoll quiere saber y ser capaz de esquivar esta afirmación, también. Whatrsquos Wrong Este escenario de llamada doble llama dos veces en sucesión. Pero si hubo un retraso entre la primera y la segunda llamada de regreso, y el corredor de prueba que salió durante ese retraso, suyo obtener una prueba exitosa en lugar de estrellarse cada vez. Con un retraso entre las devoluciones de llamada, su hijo solo dispara la afirmación cuando otras pruebas mantuvieron el proceso del corredor de prueba funcionando lo suficiente. Esta situación es paralela a la de la devolución de llamadas demasiado tarde: no hay problemas hasta que aparezca hasta que otra cosa se acabe el reloj. Usted wonrsquot alguna vez los trucos cuando yoursquore golpeando lejos en lo que la última prueba yoursquore trabajando en es, porque un corredor de prueba corriendo sólo que la prueba asíncrona se saldrá tan pronto como el tiempo de espera se agota, antes de la devolución de llamada demasiado tarde / segundo puede ocurrir . Es posible que ni siquiera los disparen cuando ejecute toda su suite de pruebas al principio, ya que podrían ser la última prueba en la ejecución o las pruebas que siguen a ejecutar por mucho tiempo. Esto también es desagradable para ejecutar en: Cuando una declaración de viajes, bombardea todo el proceso de prueba. Estas afirmaciones no son suficientes para probar fallas que permitirían que la prueba continúe en su lugar, XCTest trata como error del programador: Cumplir una promesa después de que su prueba ya ha terminado. Llenar una promesa ya llena Para ser justos, estos casos se mencionan en la documentación de XCTestExpectation. fulfill (): Llamar-cumplimentar para marcar una expectativa como si se hubiera cumplido. Itrsquos un error para llamar - llenar una expectativa que ya se ha cumplido o cuando el caso de prueba que vended la expectativa ya ha completado. Pero la documentación no es explícita que ldquoitrsquos un errorrdquo traduce a ldquoand bombardeará todo tu proceso de prueba. Evitar estas afirmaciones En ambos casos, el problema es que wersquore llamadas cumplir cuando no deberíamos. Así que letrsquos no hacer eso. Deja que la expectativa muera con la prueba XCTest realmente se aferra a las expectativas que crea para que pueda recogerlos durante la llamada de espera. Nuestro método de prueba no necesita otra referencia más fuerte a la expectativa si trabajamos con una referencia débil en nuestro cierre de devolución de llamada, la expectativa morirá con nuestra prueba, en lugar de retrasarnos para que nos volvamos a pasar después de que la prueba haya terminado y wersquoll tiene Convirtió nuestra devolución de llamada en un no-op. En primer lugar, neutralizar el tiempo bombardeado testNotWaitingLongEnough prefijando su nombre con una x por lo que wonrsquot obtener recogido por el corredor de prueba más: Mensajes recientes

No comments:

Post a Comment