2017-02-26 3 views
0

Irgendwie kann ich Mocha JS-Test für eine relativ sehr einfache Funktion nicht schreiben. Die JavaScript-Quelldatei sieht wie folgt ausSchreiben Mokka Test für Async-Funktionen, die setTimeout() verwendet

exports.cb = function() { 
    console.log("The function is called after 3 seconds"); 
} 

exports.testfn = function(cb) { 
    setTimeout(cb, 3000); 
} 

Und der Test-Code wird als

geschrieben
describe('Main Test', function(){ 
    it('A callback Tests', function(done){ 
    asn.testfn(asn.cb); 
    done(); 
    }); 
}); 

Ich bin Begegnung mit 2 Probleme.

    1. Der Code Test endet sofort mit done()
    1. Wenn ich nicht() durchgeführt nenne, dann die Funktion aufgerufen wird, aber Tests nicht besteht, weil es für Asynchron-Funktionen() aufrufen getan erwartet

ich habe in Dokumentationen gesucht, aber nicht sicher, wie dies ca n gemacht werden.

Ich kann Tests mit Versprechen schreiben und es funktioniert gut. Aber für die Szenarien, in denen wir setTimeout verwenden müssen, wie soll es gemacht werden?

+0

Was möchten Sie testen? 'testfn' oder' cb'? –

Antwort

1

Unter der Annahme, was Sie testen möchten, ist testfn, Sie nicht cb verwenden würden, können Sie einen Rückruf im Test verwenden würde; siehe Kommentar:

describe('Main Test', function(){ 
    it('testfn calls the function after three seconds', function(done){ 
    // Remember the start time 
    var start = Date.now(); 
    // Schedule callback 
    asn.testfn(function() { 
     // Has it been at least three seconds? 
     if (Date.now() - start < 3000) { 
      // No, trigger an error 
     } else { 
      // Yes, all's good! 
      done(); 
     } 
    }); 
    }); 
}); 

Wenn Sie aus irgendeinem Grund asn.cb nennen, können Sie es in der anonymen Funktion oben tun würde, aber wenn Sie asn.cb testen möchten, sollten Sie das tun serparately von asn.testfn testen.

0
describe('Main Test', function(){ 
    it('A callback Tests', function(done){ 
    asn.testfn(function() { 
     asn.cb(); 
     done(); 
    }); 
    }); 
});