ho una sezione di codice che utilizza node-sync in questo modo:Testing codice sincrono
function funcA() {
return new Promise(function(resolve, reject) {
Sync(function() {
return funcB.sync();
}, function (err, result) {
if(err) {
reject(err);
} else {
resolve(result);
}
});
}
Questo codice viene testato con moka + chai:
it("should return array", function() {
return funcA().then(function(result) {
expect(result).to.be.an.instanceof(Array);
});
});
Ha funzionato paio bene di mesi fa , ma ora questo test sempre timeout:
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
quello che ho provato finora:
- utilizzando
done()
invece di restituire una promessa - sostituzione
node-sync
consynchronize.js
- aumentando timeout
Quello che ho scoperto, è che expect(...
parte di questo test è, infatti, essere chiamato , ma solo dopo che la moka ha ucciso il test. Indipendentemente dall'intervallo di timeout attualmente impostato, expect(..
viene chiamato sempre ~ 20 millisecondi dopo che ho ricevuto il messaggio Error: timeout
.
Ho risolto il problema aggiungendo setInterval(function(){}, 10)
nella parte superiore del file di test. Mi piacerebbe sapere perché questo ha funzionato e se c'è un modo migliore per risolvere questo?
[MODIFICA] Sembra che questo sia un problema specifico della versione del nodo. Il test fallisce su 0.12.4 ma funziona correttamente su 0.10.38.
[EDIT] Il codice attuale è disponibile here.
Sembra molto strano .. Posso riprodurlo ma non riesco a capire quale sia il problema. potrebbe essere una soluzione lunga, ma forse scavare nella sincronizzazione dei nodi, vedere questi biglietti github [qui] (https://github.com/ybogdanov/node-sync/issues/41) e [qui] (https: // github. it/ybogdanov/node-sync/issues/36) –
btw è tipicamente consigliabile (imho) non eseguire il codice in modo asincrono in un test. So che stai tentando di eseguire questo blocco di sincronizzazione, ma forse prova il modulo chai-come promesso in modo da poter rimuovere il 'done' –