Test.startTest y Test.stopTest
El código asíncrono se ejecuta más tarde, pero un test necesita el resultado ya. Test.stopTest() ejecuta en ese momento todo lo que se encoló desde Test.startTest(), y además da a esa parte un presupuesto de límites nuevo.
✓ En esta sub-lección
- 01Probar un Batch, un Queueable o un @future con startTest y stopTest.
- 02Explicar qué pasa con los límites entre startTest y stopTest.
- 03Preparar los datos teniendo en cuenta que el Batch hace una sola tanda en un test.
La nutria: ¿Te acuerdas? · Repaso de la lección 3
¿Qué falla en un test que termina con Assert.isTrue(true)?
La migración del Módulo 9 es un Batch. Si en un test llamas a Database.executeBatch y en la línea siguiente compruebas las filas, verás que no ha cambiado nada: el Batch está en la cola y el test ya ha terminado. Hace falta una forma de decir «ejecuta ahora lo encolado y espera».
Test.startTest();
Database.executeBatch(new RenewalMigrationBatch(), 200); // se encola…
Test.stopTest(); // …y aquí se ejecuta entero
Integer pending = [SELECT COUNT() FROM ERP_Renewal__c WHERE Processed__c = false];
Assert.areEqual(0, pending, 'Después del Batch no puede quedar ninguna fila pendiente');- Todo lo asíncrono que se encola entre startTest y stopTest (@future, Queueable, Batch, Scheduled) se ejecuta al llegar a stopTest, antes de la línea siguiente.
- Lo que va entre las dos líneas recibe un presupuesto de límites nuevo: la preparación de datos no le gasta consultas a lo que pruebas.
- Cada test puede llamar a startTest y stopTest una sola vez.
- Test.startTest();
- Database.executeBatch(new RenewalMigrationBatch(), 200);
- Test.stopTest();
- Assert.areEqual(0, pending, '…');
Paso 1 de 4
150 filas pendientes preparadas en el setup. Pulsa Reproducir.
La nutria: El «Run Now» del trabajo programado
La nutria: ¿Y por qué no un Flow? Porque sus tests no prueban lo asíncrono