2014-08-27 10 views
5

I risultati sono sorprendenti con gli helper di test di Ember andThen e click. Secondo documentation di Ember:Ember.JS Problemi di test di integrazione con eThen e click helper

l'assistente andThen attenderà tutti i precedenti aiutanti asincroni per completare prima di progredire in avanti.

Tuttavia, sto trovando che questo non sembra essere sempre il caso. Nell'esempio seguente, ci sono 3 dichiarazioni console.debug. Mi aspetto che vengano registrati nell'ordine A -> B -> C. Tuttavia ottengo costantemente questo ordine: A -> C -> B. Riesco a ottenere l'ordine ABC previsto solo quando utilizzo solo uno dei due clic aiutanti. Non ci sono listener di eventi (azioni) associati all'elemento <div> a cui si fa riferimento all'interno degli helper di clic.

Qualcuno può spiegare questo comportamento imprevisto? C'è un errore nel mio utilizzo degli helper? O un bug con la struttura di test di Ember?

andThen(function() { 
    console.debug('mark A'); 

    click('div:first'); // with just 1 click helper, debug order is ABC 
    click('div:first'); // with this second click helper, debug order is ACB 

    andThen(function() { 
     console.debug('mark B'); 
    }); 
}); 

andThen(function() { 
    console.debug('mark C'); 
}); 

Edit:

Sulla base della risposta data da Kingpin2k, ho finito per perseguire la seguente soluzione per arrivare al test di stile che cercavo.

Innanzitutto, ho creato un helper di test asincrono denominato next. In secondo luogo, ho sostituito tutti gli aiutanti andThen nel mio codice con gli helper personalizzati next. Questo ha permesso al mio codice di funzionare nell'ordine che mi aspettavo.

// test-helper.js 
Ember.Test.registerAsyncHelper('next', function(app, fn) { 
    fn(); 
}); 

// my-integration-test.js 
next(function() { 
    console.debug('mark A'); 

    click('div:first'); 
    click('div:first'); 

    next(function() { 
     console.debug('mark B'); 
    }); 
}); 

next(function() { 
    console.debug('mark C'); 
}); 

risposta

5

andThen è solo zucchero sintattico per lastPromiseEmberSawCreated.then in modo davvero assomiglia a questo:

lastPromiseEmberSawCreated.then(function(){ 
    console.debug('mark A'); 

    click('div:first'); // with just 1 click helper, debug order is ABC 
    click('div:first'); // with this second click helper, debug order is ACB 

    nextLastPromiseEmberSawCreated.then(function() { 
     console.debug('mark B'); 
    }); 
}); 

// the promise won't have changed in between these two `andThen` calls 
// because Ember had no cpu time, and you didn't make any additional calls 

lastPromiseEmberSawCreated.then(function(){ 
    console.debug('mark C'); 
}); 
+1

tua spiegazione è diverso da quello che ho capito sulla base della documentazione a http://emberjs.com/guides/ collaudo/test-aiutanti/# toc_wait-aiutanti. Ma la tua spiegazione ha senso e mi ha portato alla soluzione che ho descritto nel post modificato. – jake

+1

È un po 'nascosto, ma è implicito in questa affermazione 'Nota e poi ha un singolo argomento della funzione che contiene il codice da eseguire dopo che gli altri helper di test hanno finito., Ma questa istruzione' L'helper andThen attenderà tutte le precedenti aiutanti asincroni da completare prima di progredire in avanti. è fuorviante, in realtà è necessario leggerli insieme per una dichiarazione accurata. Significa davvero che il codice inserito non verrà eseguito fino al completamento della promessa globale corrente, ma continuerà con il codice al di fuori di andThen. – Kingpin2k

Problemi correlati