Ich versuche meine Node.js/Express.js Anwendung mit Mocha und Zombie zu testen. Ich kann einfache Tests erhalten, aber sobald ich die Skript-Tags für Twitter Bootstrap zu meinen Ansichten hinzufüge, gibt das Browser-Objekt leeres HTML zurück.Warum gibt der Browser zombie.js bei der Verwendung von Bootstrap einen leeren HTML-Code zurück?
Hier ist mein Testcode:
process.env.NODE_ENV = 'test';
var app = require('../app');
var assert = require('assert');
var Browser = require('zombie');
describe('home page', function() {
before(function() {
this.server = app.listen(3000);
this.browser = new Browser({site: 'http://localhost:3000', debug : true});
});
it('should show welcome', function(done) {
var browser = this.browser;
browser
.visit("/")
.then(function() {
console.log(browser.html());
})
.fail(function(error) {
console.log("Error: ", error);
})
.then(done);
});
after(function(done) {
this.server.close(done);
});
});
Der Blick Code (meine layout.jade-Datei):
doctype 5
html
head
title= title
link(rel='stylesheet', href='/stylesheets/style.css')
script(src='/javascripts/jquery-2.0.3.min.js')
script(src='/javascripts/bootstrap.min.js')
body
.navbar.navbar-inverse.navbar-fixed-top
.container
.navbar-header
button.navbar-toggle(type='button', data-toggle='collapse', data-target='.navbar-collapse')
span.icon-bar
span.icon-bar
span.icon-bar
a.navbar-brand(href='/') Contact Database
.collapse.navbar-collapse
ul.nav.navbar-nav
li.active
a(href='/') Home
li.active
a(href='/contacts') Contacts
block content
Wenn ich die Script-Tags zu entfernen, wird der HTML-Code auf der Konsole angemeldet als erwartet. Ansonsten bekomme ich leeres HTML zurück.
Die Debug-Ausgabe:
home page
◦ should show welcome: Zombie: Opened window http://localhost:3000/
GET/200 283ms - 1018b
Zombie: GET http://localhost:3000/ => 200
Zombie: Loaded document http://localhost:3000/
GET /javascripts/bootstrap.min.js 200 4ms - 27.08kb
Zombie: GET http://localhost:3000/javascripts/jquery-2.0.3.min.js => 200
Zombie: GET http://localhost:3000/javascripts/bootstrap.min.js => 200
GET /javascripts/jquery-2.0.3.min.js 200 41ms - 81.65kb
<html></html>
Zombie: Event loop is empty
✓ should show welcome (414ms)
Es scheint, dass das Problem mit dem Timing zu tun haben könnte. Das Dokument wird geladen, dann werden die Javascript-Dateien geladen. Ich frage mich, ob Zombie meine Callback-Funktion ausführt, bevor das Javascript geladen wird, daher ist das DOM zu diesem Zeitpunkt leer. Irgendwelche Ideen?
Update:
Das unten durch wprl Vorschlag gelöst wurde.
Hier ist der Test, der, nach dem Hinzufügen einer Wartefunktion funktioniert:
it('should show welcome', function(done) {
// Wait until page is loaded
function pageLoaded(window) {
return window.document.querySelector(".container");
}
var browser = this.browser;
browser.visit("/");
browser.wait(pageLoaded, function() {
console.log(browser.html());
});
done();
});
Ich muss meine Testlogik umschreiben ein bisschen jetzt, aber der Schlüssel, um es an die Arbeit wurde mit der Wartefunktion.
Das hat super funktioniert! Ich bearbeite meinen Beitrag, um den aktualisierten Testcode anzuzeigen. Vielen Dank! –