2016-09-26 2 views
0

Я использую Chai средство для тестирования Логгина, но я получаюМокко время запроса Chai из превышают по res.json

Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test 

it('POST /api/v1/account/me status 500', function(done) { 
    var agent = chai.request.agent(server); 
    agent.post('/api/v1/account/login') 
     .send({_email: '[email protected]', _password: 'testtest'}) 
     .then(function(res){ 
     agent.get('/api/v1/account/logout') 
      .then(function(res2){ 
       agent.get('/api/v1/account/me') 
        .then(function(res3){ 
         res2.should.have.status(500); 
         done(); 
        }); 
     }); 
    }); 
}); 

В моем «/ API/v1/счет/я», я есть:

router.get('/me', auth.isAuthenticated, function(req, res){ 
    res.json(new Response({error:false, results: req.session.user})) 
}); 

И мой isAuthenticated:

isAuthenticated: function (req, res, next) { 

    var sess = req.session; 
    if(sess.user) 
     return next(); 

    res.status(500).json(new Response({error:true})).end(); 
    return; 
} 

проблема заключается в том, что

res.status(500).json(new Response({error:true})).end(); 

никогда не возвращается 500. Если я меняю статус (500) со статусом (200), все работает нормально (не тест, конечно).

ответ

0

В коде есть 2 проблемы.

  1. .then принимает два параметра обратного вызова: первый обрабатывает успеха ответ (200 OK), второй обрабатывает сбой ответа (404, 500 и т.д.). Таким образом, вам нужно поместить код подтверждения во второй обратный вызов. Пример кода:

    agent.get('/api/v1/account/me') 
        .then(function(res3) { 
         // assertion statements when response is successful. 
        }, function(res4) { 
         // assertion statements when response is failed. 
         res4.should.have.status(500); 
        }); 
    
  2. Не используйте done. Когда утверждение утверждения chai не удалось (res4.should.have.status(500)), оно будет вызывать AssertionError, что означает, что обратный вызов done никогда не будет вызван - в конечном итоге это приведет к ошибке «Ошибка: превышение 2000 мс». Вместо этого, просто return агент invokation результат и это хорошо идти:

    var agent = chai.request.agent(server); 
    return agent.post('/api/v1/account/login') 
          ... 
    
+0

Он работал как шарм! Спасибо большое! – JVilla

0

Добавить внутри Опишите, или до это. И вы должны использовать Async-библиотеку для объединения этих вызовов.

describe('',function(){ 
    this.timeout(15000); 
    it('', function(done){ 
     Async.series([], function(cb){ 
      function(cb){ 
       cb(); 
      }, 
      function(cb){ 
       cb(); 
      } 
     }, function(err){ 
      done(); 
     }); 
    }; 
}); 
+0

Спасибо за ответ. Я не думаю, что это проблема. Кроме того, я хочу добавить, что .then() выполняется при отправке ответа. Таким образом, он отлично работает с асинхронной функцией. – JVilla

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