2013-08-12 6 views
5

Ich verwende laika zum Testen und die meteor-router Paket für das Routing. Ich möchte Tests durchführen, die zu einer Seite navigieren, ein Formular ausfüllen, es absenden und nach einer Erfolgsmeldung suchen, aber ich stecke im Navigationsteil fest. Dies war mein erster Versuch:So testen Meteor Router oder Eisen Router mit laika

var assert = require('assert'); 

suite('Router', function() { 
    test('navigate', function(done, server, client) { 
    client.eval(function() { 
     Meteor.Router.to('test'); 
     var title = $('h1').text(); 
     emit('title', title);   
    }) 
    .once('title', function(title) { 
     assert.equal(title, 'Test'); 
     done(); 
    }); 
    }); 
}); 

Das funktioniert nicht, weil Meteor.Router.to keinen Rückruf hat, und ich weiß nicht, wie die nächste Zeile ausgeführt werden, wenn die neue Seite geladen wird.

Ich habe auch versucht, mit so etwas wie diese

var page = require('webpage').create(); 

page.open('http://localhost:3000/test', function() { 
    ... 
} 

aber ich habe den Fehler Error: Cannot find module 'webpage'

bearbeiten

Ich bin zu iron router bewegen, so dass jede Antwort mit, dass auch sein hilfreich.

+1

FYI: Wenn Sie gerade erst anfangen, möchten Sie möglicherweise zu https://github.com/EventedMind/meteoron-router wechseln, die von den Autoren der letzten beiden weit verbreiteten Meteor-Router gemacht wurde. –

Antwort

0

Ich hatte das gleiche Problem. Ich musste zu einer Seite navigieren, bevor ich meine Tests durchführte. Ich benutze auch Eisenrouter. Ich dachte, du kannst nicht einfach Router.go('foo') ausführen und das war's. Sie müssen warten, bis das eigentliche Routing stattgefunden hat. Glücklicherweise stellt der Router eine Methode Router.current() zur Verfügung, die eine reaktive Datenquelle ist, die sich ändert, sobald Ihre Seite fertig ist. Also, um zu einer bestimmten Route zu navigieren, bevor meine Tests laufen, ich laufe zunächst den folgenden Codeblock:

// route to /some/path 
client.evalSync(function() { 
    // react on route change 
    Deps.autorun(function() { 
     if (Router.current().path == '/some/path') { 
      emit('return'); 
      this.stop(); 
     } 
    }); 
    Router.go('/some/path'); 
}); 

Da dies innerhalb eines evalSync() alles ist, dass dieser Block ausgeführt wird folgt nach dem Routing beendet hat.
Hoffe, das hilft.

0

Laika enthält jetzt eine waitForDOM() Funktion, die Sie einrichten können, um auf ein bestimmtes DOM-Element zu warten, das in diesem Fall ein Element in der Seite sein würde, die Sie laden.

client.eval(function() { 
    Router.go('test'); 
    waitForDOM('h1', function() { 
     var title = $('h1').text(); 
     emit('title', title); 
    }); 
}); 

Der erste Parameter ist ein jQuery-Selektor.

Verwandte Themen