6

Ich versuche, einen einfachen Ember-Integrationstest zu schreiben und bekomme trotz der Verwendung von Ember.run weiterhin einen frustrierenden Run-Loop-Fehler. Ich hatte einen Alptraum, als ich versuchte, das zum Laufen zu bringen. Wenn mir jemand helfen könnte, wäre ich so dankbar. Insbesondere kann ich sehen, dass sich der Test meldet und die nächste Seite lädt (wie es sollte), aber sobald der Test beendet ist, bekomme ich diesen Fehler. Dies ist in Bezug auf den zweiten Test, den ersten passiert (wie nichts async glaube ich).Ember-Test: Sie haben den Testmodus eingeschaltet, der die Autorun-Funktion der Run-Schleife deaktiviert

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

Wie sieht der Produktionscode (im Test) für diese App aus? Meine Vermutung ist etwas Async-Code wirft dies, aber es ist schwer zu sagen, w/out mehr Details –

+0

Ich bekomme das gleiche Problem, aber nur in Firefox, nicht Chrom. habe Phantom oder Safari nicht getestet oder zB – stevethecollier

+1

hast du eine Lösung gefunden? Ich habe das gleiche Problem .. –

Antwort

1

Wrapping Ihre Tests in Ember.run wird nicht helfen, wenn der Fehler, den Sie bekommen nicht, weil der Test-Code geschieht aber der Code der Anwendung. In Ihrer Anmeldungsroute müssen Sie einige asynchrone Anfragen machen (wie AJAX oder setTimeout sogar) und in ihren Handlern führen Sie einige Ember-API-Ausführungen aus (wie Einstellung, Übergang, irgendetwas).

Wenn Sie eine genaue Hilfe benötigen, müssen Sie Ihren Code in der Route/Controller veröffentlichen.

Ich habe vor kurzem ein eBook über die Run-Schleife veröffentlicht, einschließlich des Autorun-Mechanismus, der downloaded here sein kann.

3

Ich weiß, ich bin spät zur Party, aber hier geht sowieso:

Irgendwo in Ihrer Komponente oder Anwendungscode (dh nicht im Testcode), werden Sie wahrscheinlich auf ein Ereignis außerhalb von Ember hören (zB ein DOM-Ereignis, über jQuery oder etwas ähnliches, aber versuche während der Ausführung dieses Handlers mit ihm zu interagieren. Diese Handler-Funktionen müssen in Ember.run.bind() eingeschlossen sein oder sie werden während eines Tests keine Runloop haben. Ember.run.bind() wird auch this für Sie während des Handlers setzen.

Wenn Sie nicht Ihren Event Rückrufe in Ember.run.bind() wickeln, wird der Code wahrscheinlich noch ohne Hektik während eines normalen Lauf der Anwendung ausgeführt werden, da die Autorun-Funktion wird Runloop anspruchs (zB finden, wenn Sie etwas mit Ember.run.schedule() planen während des Handlers) Interaktionen mit Ember im Code und starten eine Runloop für sie, aber es ist in Tests deaktiviert.

1

Ich habe das gleiche Problem in einer Komponente Integrationstest. Der Fehler ist:

Assertionsfehler: Sie haben auf Testmodus eingeschaltet, die die Laufschleife des Autorun deaktiviert.

Sie müssen jeden Code mit asynchronen Nebenwirkungen in einem Lauf umbrechen.

Und ich fand den Grund des Problems für Integrationstests. Ich bin Rendering die Komponente mit dem folgenden Code:

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

Nach dem Rendern Aktualisierung myobject wie unten verursacht den Fehler .:

myobject.set('x',2); 

Weil es nicht innerhalb einer ember Laufschleife ist.

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

Für Ihren Fall:

Anstelle dieser falsch empfangenen Berufung, den Wert der Aktualisierung sollte als eine der folgenden getan werden ich nicht versucht, aber meine Meinung ist, dass Asynchron-Test Helfer wie Besuch , klicken Sie auf, fillIn kann in Abnahmetests nicht in Integrationstests aus dem folgenden Grund verwendet werden.

+1

'myobject.set ('x', 2);' vs. 'this.set ('param.x', 2);' half mir, danke! –

Verwandte Themen