ConcurrentHashMap или ConcurrentLinkedQueue или ConcurrentSkipListMap может быть другой опцией, потому что они никогда не будут бросать любое ConcurrentModificationException, даже если вы удалите или добавите элемент.
Это не относится к самому Угловому, но к асинхронным тестам Jasmine .
Если вам нужно использовать setTimeout
, используйте Angular $timeout
. И если вы хотите иметь прекрасный контроль над исполнениями setTimeout / $ timeout, используйте mocked Clock .
Прежде всего, setTimeout
особенно сложно тестировать, так как трудно издеваться. К счастью, у AngularJS есть обертка вокруг него ($timeout
), играющая ту же роль, но ее можно легко высмеивать:
ls.DoIt = function() {
var deferred = $q.defer();
$timeout(function(){
deferred.resolve(5);
},3000);
return deferred.promise;
}
Макет, предоставленный для $timeout
, позволяет нам легко имитировать прошедшее время (с $timeout.flush()
), что означает, что наши тесты могут выполняться быстро, не ожидая завершения события async (обратите внимание, что производственный код по-прежнему использует асинхронный API!).
Измененные тесты выглядят так:
it("should equal 5", inject(function(myservice, $timeout) {
var valueToVerify;
myservice.DoIt().then(function(returned) {
valueToVerify = returned;
});
$timeout.flush();
expect(valueToVerify).toEqual(5);
}));
И, наконец, рабочий jsFiddle: http://jsfiddle.net/v9L9G/1/
DoIt
находится в цикле, поэтому он вызывается несколько раз. Как его красить несколько раз? Невозможно ли вы DoIt
сброситься? Я попытался получить асинхронный макет, чтобы очистить себя, включив в него этот , но это не кажется очень надежным.
– M.K. Safi
26 September 2013 в 15:28
valueToVerify
все еще не определено после 1000 мс?
– Lukasz Prus
1 October 2014 в 20:01