6

Sto provando a scrivere un semplice test di integrazione Ember e continuo ad ottenere il frustrante errore del ciclo di esecuzione nonostante l'utilizzo di Ember.run. Ho avuto un incubo di tempo cercando di farlo funzionare, se qualcuno potesse aiutarmi sarei così grato. Nello specifico, posso vedere il test accedere e iniziare a caricare la pagina successiva (come dovrebbe), ma non appena termina il test ricevo quell'errore. Questo riguarda il secondo test, i primi passaggi (poiché nulla è asincrono credo).Test color ambra: è stata attivata la modalità test, che disabilita l'esecuzione automatica del ciclo di esecuzione

import Ember from 'ember'; 
import startApp from 'jobs-tuftsdaily/tests/helpers/start-app'; 
import exists from 'jobs-tuftsdaily/tests/helpers/start-app'; 

var App; 

module('Integration - Landing Page', { 
    setup: function() { 
     App = startApp(); 
    }, 
    teardown: function() { 
     Ember.run(App, 'destroy'); 
    } 
}); 

test('Should load content', function() { 
    visit('/').then(function() { 
    ok(exists("*"), "Found HTML!"); 
    ok(exists('label:eq(4)'), "Slug label on page"); 
    }); 
}); 

test('Should sign in test user', function() { 
    Ember.run(function() { 
    visit('/').andThen(function() { 
     return fillIn("input[name=email]", "[email protected]"); 
    }).andThen(function() { 
     return fillIn("input[type=password]", "password"); 
    }).andThen(function() { 
     return click("button"); 
    }).andThen(function() { 
     ok(1, "stupid test passed"); 
    }); 
    }); 
}); 
+0

Che aspetto ha il codice di produzione (sotto test) per questa app? La mia ipotesi è che un po 'di codice asincrono stia lanciando questo, ma è difficile dirlo senza ulteriori dettagli –

+0

Sto ricevendo questo stesso problema, ma solo in Firefox, non in Chrome. non hai testato phantom o safari o ie – stevethecollier

+1

hai trovato una soluzione? Sto avendo lo stesso problema .. –

risposta

1

avvolgendo il test in Ember.run non aiuterà come l'errore che si stanno ottenendo non sta accadendo perché il codice di prova, ma il codice della vostra applicazione. Nel tuo percorso di accesso devi fare alcune richieste asincrone (come AJAX o setTimeout pari) e nei loro gestori esegui alcune esecuzioni API Ember (come l'impostazione, la transizione, qualsiasi cosa).

Se si desidera un aiuto esatto su questo è necessario inserire il codice nel percorso/controller.

Recentemente ho pubblicato un ebook su Run Loop, incluso il meccanismo di autorun che può essere downloaded here.

3

mi rendo conto in ritardo alla festa, ma qui va comunque:

Da qualche parte nel codice componente o applicazione (cioè, non nel codice di test), probabilmente ascoltare qualche evento al di fuori di Ember (ad esempio un evento DOM, attraverso jQuery o qualcosa del genere), ma prova a interagire con esso durante la corsa di quel gestore. Queste funzioni di gestione devono essere racchiuse in Ember.run.bind() o non avranno un runloop durante un test. Ember.run.bind() imposterà anche this durante il gestore.

Se non avvolgere la callback di eventi nel Ember.run.bind(), il codice sarà probabilmente ancora funzionare senza problemi durante una normale corsa del applicazione perché la funzione di esecuzione automatica troverà runloop esigenti (per esempio, se si pianifica qualcosa usando Ember.run.schedule() durante il gestore) interazioni con Ember nel codice e avviare un runloop per loro, ma è disattivato nei test.

1

Ho riscontrato lo stesso problema nel test di integrazione di un componente. L'errore è:

Asserzione non riuscita: è stata attivata la modalità di test, che disabilitato autorun del del run-loop.

Avrete bisogno di avvolgere qualsiasi codice con effetti collaterali asincroni in una corsa.

E ho trovato il motivo del problema per i test di integrazione. Sto rendendo la componente con il seguente codice:

let myobject = Ember.Object.create({x:1}); 
this.set('param', myobject) 
this.render(hbs`{{my-object param=param}}`); 

Dopo il rendering, l'aggiornamento myobject come di seguito causa l'errore .:

myobject.set('x',2); 

Perché non è all'interno di un tizzone run-loop.

Invece di questa chiamata difettoso: l'aggiornamento, il valore dovrebbe essere fatto come uno dei seguenti:

this.set('param.x',2); 
//OR: 
this.set('param', Ember.Object.create({x:1}); 
//OR: 
Ember.run(()=>{ 
    Ember.set(myobject,'x',2); 
}); 

Per il vostro caso: Non ho provato, ma la mia opinione è che aiutanti di test asincrone come visita , fare clic, riempireIn può essere utilizzato nei test di accettazione non nei test di integrazione a causa del seguente motivo.

+1

'myobject.set ('x', 2);' vs. 'this.set ('param.x', 2);' mi ha aiutato, grazie! –