2016-02-03 1 views
2

У меня очень простой тест Жасмина с использованием Q, и он, похоже, не работает. Я просто использую часы Jasmine mock и пытаюсь использовать Q.delay, который, я думаю, использует setTimeout под капотом.Q.delay не работает с библиотекой Q обещаний и часами Жасмина?

У меня было несколько более сложных тестов, связанных с вызовом setTimeout() с обработчиком 0 обещания then, и это тоже не сработало, но я подумал, что это сделает более простой тестовый случай для публикации в Stack Overflow.

Вот мой очень простой тест:

it('clock test', function() { 
    jasmine.clock().install(); 
    var foo = null; 
    Q.delay('hi', 10000).then(function(arg) { 
     console.log('foo'); 
     foo = arg; 
    }); 
    jasmine.clock().tick(10010); 
    expect(foo).toEqual('hi'); 
    jasmine.clock().uninstall(); 
    }); 

(Этот тест основан на тесте, найденного в аналогичной С.О. вопрос: Jasmine clock tick & Firefox: failing to trigger a Q.delay method)

Когда я запускаю тест, он не говорил Expected null to equal 'hi'.console.log даже не выполняет.

Чтобы увидеть, если проблема была с Q или что-то другое, я пытался добавить простой setTimeout вызов внутри спецификации:

setTimeout(function() { 
    console.log("bar"); 
}, 10000); 

Это сработало - bar была напечатана в консоли после вызова jasmine.clock().tick.

После того, как часы Jasmine будут удалены, начнутся нормальные часы, и после ожидания 10 секунд будет распечатано сообщение foo.

У любого есть идеи, что происходит?

ответ

1

Вы просите его выполнить асинхронную синхронизацию. Не. Попробуйте использовать асинхронный Jasmine вместо этого и оставьте с помощью часов.

it('clock test', function(done) { 
    var foo = null; 
    Q.delay('hi', 10000).then(function(arg) { 
     console.log('foo'); 
     foo = arg; 
     expect(foo).toEqual('hi'); 
     done(); 
    }); 
    }, 15000); 
+0

Я попробовал, и спецификация истекла: 'Error: Тайм-аут - Асинхронный обратный вызов не был вызван по истечению времени, указанного by jasmine.DEFAULT_TIMEOUT_INTERVAL.' Затем, снова, как только часы жасмина были удалены, через 10 секунд напечатано 'foo'. –

+1

@JoeAttardi обновлен. –

+0

Ну, конечно, это работает, но для запуска требуется 10 секунд. Я хотел использовать часовые часы Жасмина, так что это не так. Он должен работать. Когда вы устанавливаете() 'часы Jasmine, он заменяет глобальные функции, такие как' setTimeout' и друзей. Поскольку 'Q.delay' использует' setTimeout' под капотом, это должно сработать. Как только вы «отметьте» часы Жасмина за 10 секунд, он должен срабатывать. –

1

Anyone have any idea what's going on?

Возможно Q серьезно относится к асинхронности гарантии, выданной в Promises/A+ spec. Таким образом, даже когда setTimeout выполняется раньше, чем ожидалось, нет причин внезапно вызывать вызовы then синхронно. После выполнения обещания все равно придется ждать галочки.

Альтернативное объяснение состояло бы в том, что Q взял свою личную копию setTimout во время ее инициализации модуля, чтобы точно не допускать подобных конфликтов со встроенными. Вместо вызова глобальной функции он будет использовать свою внутреннюю ссылку на старую функцию и вообще не будет затронут jasmine.clock().

0

Вы можете spyOn Q.delay и избежать тестового ожидания для данной задержки:

describe('Q.delay', function() { 
    it('should call Q.delay', function(done) { 
     spyOn(Q.makePromise.prototype, 'delay').and.returnValue(function() { 
      return this; 
     }); 
     Q('A resolve value').delay(3000).then(done); 
     expect(Q.makePromise.prototype.delay).toHaveBeenCalledWith(3000); 
    }); 
});