Жасмин 2 - Асинхронный обратный вызов не был вызван в течение таймаута, указанного jasmine.DEFAULT_TIMEOUT_INTERVAL
У вас возникли проблемы с жасмином 2 и получением асинхронных спецификаций:
define(['foo'], function(foo) {
return describe('foo', function() {
beforeEach(function(done) {
window.jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
return setTimeout((function() {
console.log('inside timeout');
return done();
}), window.jasmine.DEFAULT_TIMEOUT_INTERVAL);
});
return it('passes', function() {
return expect({}).toBeDefined();
});
});
});
Когда я бегу через карму, я возвращаюсь
Ошибка: Тайм-аут - Обратный вызов Async не вызывается в течение таймаута указанный jasmine.DEFAULT_TIMEOUT_INTERVAL.
а затем спецификации не работают. Я попытался переопределить таймаут по умолчанию, но я не могу пройти мимо ошибки
Ответы
Ответ 1
Вы используете тот же интервал времени ожидания, что и Jasmine, чтобы использовать тесты с отказом при тайм-ауте, т.е. ваш тайм-аут запускается с использованием стандартного интервала Jasmine, который не проходит тест.
Если вы установите время ожидания меньше, чем истечение времени ожидания жасмина, тест проходит.
describe('foo', function () {
beforeEach(function (done) {
window.jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
setTimeout(function () {
console.log('inside timeout');
done();
}, 500);
});
it('passes', function () {
expect({}).toBeDefined();
});
});
Смотрите скрипку здесь
Ответ 2
Мои 2 цента. Я также получил эту ошибку, упомянутую в вопросе в другом сценарии.
У меня была очень простая спецификация:
describe('login feature', function() {
it('should show the logged in user name after successful login', function(done) {
expect({}).toBeDefined();
//done(); // if you don't call this done here, then also above error comes
});
});
См. прокомментированную функцию //done () в 'it'
Ответ 3
Другим вариантом, который может сработать для вас, является использование async
Асинхронная функция является одной из утилит тестирования Angular и должна быть импортирована... Она принимает функцию без параметров и возвращает функцию, которая становится истинным аргументом функции beforeEach
Тело аргумента async похоже на тело синхронного beforeEach. В этом нет ничего очевидного асинхронного. Например, он не возвращает обещание, и нет никакой функции для вызова, как это было бы при стандартных асинхронных тестах Jasmine. Внутренне асинхронно организует для тела beforeEach для запуска в специальной асинхронной тестовой зоне, которая скрывает механику асинхронного выполнения.
Смотрите: https://angular.io/docs/ts/latest/guide/testing.html#!#async-in-before-each
describe('Component: MyComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
providers: [
{provide: MyService, useValue: MyServiceMock()},
]
})
// Using webpack through Angular Cli. You may need ".compileComponents()"
fixture = TestBed.createComponent(MyComponent)
component = fixture.componentInstance
// Initialize the component
component.ngOnInit()
fixture.detectChanges()
}))
it('should show the logged in user name after successful login',() {
expect({}).toBeDefined()
})
})