2016-03-22 1 views
0

Я использую Sinon с Mocha для проверки значений даты истечения срока действия. Я использовал тот же код несколько месяцев назад, и он работал нормально, но где-то между v1.12.x и v1.17.x, что-то изменилось, и я не могу найти правильный путь.Sinon useFakeTimers() создает таймаут в before/afterEach

let sinon = require('sinon'); 
describe('USER & AUTHENTICATION ENDPOINTS', function(done) { 
    beforeEach(function() { 
     this.clock = sinon.useFakeTimers(new Date().getTime()); 
     return fixtures.load(data); 
    }); 
    afterEach(function() { 
     this.clock.restore(); 
     return fixtures.clear(data); 
    }); 

    context('POST /users', function() { ... } 
}); 
  • Я попытался с и без new Date().getTime() аргумента.
  • Я пробовал пропустить и явно позвонить done().
  • Я попытался удалить мои загрузки/очистки процессов.

Конечный результат всегда одинаков:

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

Что-то изменилось, что я просто не заметил в документации? Есть ли у меня какая-то ошибка, которую я не вижу?

Любые мысли будут оценены.

UPDATE

Так немного больше информации здесь. Это явно имеет отношение к моему коду, но я в недоумении.

Если я прокомментирую каждый фактический тест, тесты пройдут и дадут мне зеленый «0 проход».

Если я запускаю сам тест, даже тот, который только это:

context('POST /users', function() { 
    it('should create a new user', function(done) { 
     done(); 
    }) 
}); 

Я обратно на тайм-аут. Что мне не хватает?

ответ

2

Mystery solved. Похоже, что это конфликт между Синоном и версиями Knex> 0.7.6.

Похоже, что pool2 полагается на поведение setTimeout. Использование sinon.useFakeTimers(...) заменяет несколько методов, включая setTimeout с синхронными версиями, которые его разрывают. Можно исправить, заменив: clock = sinon.useFakeTimers(Number(date), 'Date');

Мой первоначальный код был написан в мире, где последней версией была Knex v0.7.6. Теперь, когда это не все, даже если сам код был тем же. Я использовал упомянутое исправление, и все будет хорошо.

1

Вы передаете done к вашему describe обратного вызова в строке 2:

describe('USER & AUTHENTICATION ENDPOINTS', function(done) { 

Mocha ожидает от вас, чтобы вызвать его ... Чтобы избавиться от ошибки тайм-аута, просто удалите параметр done из обратного вызова.

+0

Да, это была хотя бы часть проблемы, но, похоже, не проблема. Убрав его, я все еще вижу ту же проблему. –

+0

Я провел тест самостоятельно с помощью sinon 1.17.3, и я прокомментировал ваши строки fixtures.load() и fixtures.clear(). Для меня тест зеленый без тайм-аутов. Так может быть, что-то странное происходит в этих строках? – Nicole

+0

(И, честно говоря, тест даже зеленый с параметром «done» в самом дальнем описании ...) – Nicole