2016-05-06 2 views
0

У меня возникли проблемы с выполнением асинхронных функций в тестах мокки. Я запускаю сервер узла в вызове beforeEach и цепляю клиентский сокет для подключения к нему перед выполнением каких-либо других операторов().Выполнение события синхронно в мокко

проблема - я получаю различные выходы с каждого мокко вызова

это мой мокко тест

// тестирование событий HTTPServer

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'); 
     }) 
    }) 

}) 

это выход из первый тестовый вызов

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. 

это второй вывод вызова

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) 

, как вы можете видеть, журнал, связанный с «подключенным пользователем», происходит очень случайным образом. Как я могу контролировать это синхронно?

ответ

1

Единственная проблема, которую я вижу, это то, что ваш крюк beforeEach не return его обещание. Снятие фигурных скобок, чтобы сделать правую сторону стрелки выражение должно работать:

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

Или это:

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

Тех же правила, которые применяются к асинхронному коду в тестах применяется для асинхронного кода в крючках , Вы должны вернуть обещание или вызвать обратный вызов done.

+0

это работает .. но я не понимаю, почему .. есть ли что-нибудь, что я могу прочитать, чтобы очистить мои сомнения? – Kannaj

+1

В моем последнем абзаце объясняется проблема: «Те же правила, которые применяются к асинхронному коду в тестах, применяются к асинхронному коду в перехватах. Вы должны вернуть обещание или вызвать выполненный обратный вызов». Теперь, если вы не знаете, как Mocha занимается асинхронными тестами, это проблема. [Этот ответ] (http://stackoverflow.com/a/20760704/1906307) может помочь. – Louis

Смежные вопросы