Nach weiteren stochern und stoßen, fand ich einige unglaublich nützliche Informationen unter http://blog.foundry376.com/2012/09/connecting-to-a-socket-io-server-from-node-js-unit-tests. Im Beispiel des Autors weist er auf den kritischen Schritt hin, Socket-Listener in den "before *" - Hooks zu etablieren. Dieses Beispiel funktioniert (vorausgesetzt, ein Server für Socket-Verbindungen auf localhost hört: 3001, natürlich)
var io = require('socket.io-client')
, assert = require('assert')
, expect = require('expect.js');
describe('Suite of unit tests', function() {
var socket;
beforeEach(function(done) {
// Setup
socket = io.connect('http://localhost:3001', {
'reconnection delay' : 0
, 'reopen delay' : 0
, 'force new connection' : true
});
socket.on('connect', function() {
console.log('worked...');
done();
});
socket.on('disconnect', function() {
console.log('disconnected...');
})
});
afterEach(function(done) {
// Cleanup
if(socket.connected) {
console.log('disconnecting...');
socket.disconnect();
} else {
// There will not be a connection unless you have done() in beforeEach, socket.on('connect'...)
console.log('no connection to break...');
}
done();
});
describe('First (hopefully useful) test', function() {
it('Doing some things with indexOf()', function(done) {
expect([1, 2, 3].indexOf(5)).to.be.equal(-1);
expect([1, 2, 3].indexOf(0)).to.be.equal(-1);
done();
});
it('Doing something else with indexOf()', function(done) {
expect([1, 2, 3].indexOf(5)).to.be.equal(-1);
expect([1, 2, 3].indexOf(0)).to.be.equal(-1);
done();
});
});
});
ich, dass die Platzierung von done gefunden() in den before, socket.on ('connect' ...) Der Zuhörer war entscheidend für den Aufbau der Verbindung. Wenn Sie z. B. done() im Listener kommentieren und dann einen Bereich hinzufügen (kurz bevor Sie den beforeEach-Befehl beenden), wird die Meldung "no connection to break ..." statt der Meldung "disconnecting .." angezeigt. ." Botschaft. Wie so:
beforeEach(function(done) {
// Setup
socket = io.connect('http://localhost:3001', {
'reconnection delay' : 0
, 'reopen delay' : 0
, 'force new connection' : true
});
socket.on('connect', function() {
console.log('worked...');
//done();
});
socket.on('disconnect', function() {
console.log('disconnected...');
});
done();
});
Ich bin neu in Mokka, so gibt es wahrscheinlich einen sehr offensichtlichen Grund für Eingeweihte für die Platzierung erfolgt() withiin den Sockel Umfang selbst. Hoffentlich rettet dieses kleine Detail andere in meinen Schuhen vor dem Haarziehen.
Für mich ist der obige Test (bei korrekter Scoping von done()) Ausgänge:
Suite of unit tests
First (hopefully useful) test
◦ Doing some things with indexOf(): worked...
✓ Doing some things with indexOf()
disconnecting...
disconnected...
◦ Doing something else with indexOf(): worked...
✓ Doing something else with indexOf()
disconnecting...
disconnected...
2 tests complete (93 ms)
Wird dieser Mokka oder Jasmin getestet? Für asynchrone Mocha-Tests (was das ist) muss Ihre Testfunktion eine Callback-Funktion (testDone) haben, damit mocha weiß, wie man sie richtig behandelt. Dies funktioniert möglicherweise, aber Mocha wird beendet, bevor das Ereignis "connect" ausgelöst wird, weil Mocha nicht weiß, dass es warten soll. –