2016-05-06 6 views
0

Ich habe Probleme beim Ausführen von asynchronen Funktionen in Mocha-Tests. Ich beginne den Knoten-Server in dem beforeEach-Aufruf und verkette einen Client-Socket, um eine Verbindung zu ihm herzustellen, bevor ich irgendwelche anderen it() -Anweisungen ausführe.Ausführen des Ereignisses synchron in Mokka

das Problem ist - ich bin immer abwechslungsreich Ausgänge mit jedem Mokka Anruf

dies ist mein Mokka Test

// Testen Ereignisse von Http

import chai,{expect} from 'chai'; 
import sinon from 'sinon' 
import SocketCluster from 'socketcluster-client'; 
import testServer from '../../server/server.js'; 
import net from 'net'; 
import chaiAsPromised from 'chai-as-promised'; 

function startServer(port){ 
    return new Promise(function(resolve,reject){ 
    resolve(testServer(port)) 
    }) 
} 

chai.use(chaiAsPromised) 

describe('httpServer',() => { 

    var client; 

    var options = { 
    port: 4000 
    } 

    beforeEach(() => { 
    startServer(4000).then(() => { 
     console.log('Server started') 
     client = SocketCluster.connect(options) 
    }) 
    }) 

    it('should return Anonymous user if client doesnt send a valid JWT token on user_connected event',() => { 

     return client.emit('user_connected',{id_token:false},(err,data) => { 
     expect(data).to.eventually.be.a('string'); 
     }) 
    }) 

}) 

ist dies die Ausgabe von dem erste Testanruf

httpServer 
Test server started on 4000 
Server started 
user connected 
    1) "before each" hook for "should return Anonymous user if client doesnt send a valid JWT token on user_connected event" 

    Main page 
    ✓ should show a sign-in page if isAuthenticated is false (60ms) 
    ✓ should show a welcome text if isAuthenticated is true 

    SignUp login 
    ✓ should return isAuthenticated=false on SIGNUP_REQUEST 
    ✓ should return isAuthenticated=true on SIGNUP_SUCCESS 
    ✓ should return isAuthenticated=false and errorMessage on SIGNUP_FAILURE 


    5 passing (2s) 
    1 failing 

    1) httpServer "before each" hook for "should return Anonymous user if client doesnt send a valid JWT token on user_connected event": 
    Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test. 

ist dies der zweite Anruf Ausgang

httpServer 
    1) should return Anonymous user if client doesnt send a valid JWT token on user_connected event 
Test server started on 4000 
Server started 

    Main page 
    ✓ should show a sign-in page if isAuthenticated is false (82ms) 
    ✓ should show a welcome text if isAuthenticated is true 
user connected 

    SignUp login 
    ✓ should return isAuthenticated=false on SIGNUP_REQUEST 
    ✓ should return isAuthenticated=true on SIGNUP_SUCCESS 
    ✓ should return isAuthenticated=false and errorMessage on SIGNUP_FAILURE 


    5 passing (347ms) 
    1 failing 

    1) httpServer should return Anonymous user if client doesnt send a valid JWT token on user_connected event: 
    TypeError: Cannot read property 'emit' of undefined 
     at Context.<anonymous> (server.test.js:34:14) 

Wie Sie sehen können, passiert das Protokoll "Benutzer verbunden" sehr zufällig. Wie kontrolliere ich, dass es synchron passiert?

Antwort

1

Das einzige Problem, das ich sehe, ist, dass Ihr beforeEach Haken nicht zurückgibt sein Versprechen. Das Entfernen der geschweiften Klammern, um die rechte Seite des Pfeils ein Ausdruck sollte funktionieren:

beforeEach(() => 
    startServer(4000).then(() => { 
    console.log('Server started') 
    client = SocketCluster.connect(options) 
    }) 
); 

Oder diese:

beforeEach(() => { 
    return startServer(4000).then(() => { 
    console.log('Server started') 
    client = SocketCluster.connect(options) 
    }) 
}); 

die gleichen Regeln, die in Tests asynchronen Code gelten gilt für asynchronen Code in Haken . Sie müssen ein Versprechen zurückgeben oder den Rückruf done aufrufen.

+0

das funktioniert .. aber ich verstehe nicht warum ... gibt es etwas, was ich lesen kann, um meine Zweifel zu klären? – Kannaj

+1

Mein letzter Absatz erklärt das Problem: "Die gleichen Regeln, die für asynchronen Code in Tests gelten, gelten für asynchronen Code in Hooks. Sie müssen eine Zusage zurückgeben oder den done Callback aufrufen." Nun, wenn Sie nicht wissen, wie Mocha mit asynchronen Tests umgeht, ist das ein Problem. [Diese Antwort] (http://stackoverflow.com/a/20760704/1906307) kann helfen. – Louis