Po dalszym szturchaniu i szturchaniu znalazłem niewiarygodnie przydatne informacje pod numerem http://blog.foundry376.com/2012/09/connecting-to-a-socket-io-server-from-node-js-unit-tests. W przykładzie autora wskazuje krytyczny krok ustanawiania detektorów gniazd w hakach "przed *". Ten przykład działa (przy założeniu, że serwer nasłuchuje połączeń gniazd na localhost: 3001, oczywiście)
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();
});
});
});
I stwierdził, że umieszczenie done() w beforeEach, socket.on ('connect' ...) słuchacz miał kluczowe znaczenie dla ustanowienia połączenia. Na przykład, jeśli skomentujesz done() w detektorze, a następnie dodasz jeden zasięg poza (tuż przed wyjściem z beforeEach), zobaczysz komunikat "brak połączenia z przerwą ..." zamiast "odłączania .. . "wiadomość. Tak:
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();
});
Jestem nowy Mocha, więc prawdopodobnie jest to bardzo oczywistego powodu, dla wtajemniczonych za wprowadzenie zrobić() Withiin samego zakresu sieciowego. Mam nadzieję, że ten drobny szczegół uratuje innych w moich butach przed ciągnięciem włosów.
Dla mnie powyższe testy (z prawidłowym scopingu of done()) Wyjścia:
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)
Czy to testy mokka lub jaśminu? W przypadku asynchronicznych testów mokka (które to jest) twoja funkcja testowa musi przyjąć funkcję 'callback (testDone)', więc mocha wie, aby traktować ją odpowiednio. To może faktycznie działać, ale mocha wychodzi przed wyzwaniem "connect", ponieważ mocha nie wie, że powinien poczekać. –