#javascript #angular #jasmine #angular2-testing
#javascript #angular #jasmine #angular2-тестирование
Вопрос:
Я создаю модульные тестовые наборы для своих компонентов angular2.
пока тестовые примеры выполняются корректно.
но я сталкиваюсь с проблемами, касающимися моих асинхронных вызовов.
Например У меня есть следующий метод для создания нового пользователя, который выдает ошибку, если пользователь уже присутствует :
onSubmit():Observable<any> {
this._userService.saveUser(this.user).subscribe(
(response) => {
this._directoryService.getDirectoryById(this.selectedDirectory._id).subscribe(
(directory) => {
this.users = directory[0].users;
},
(error) => {
return error;
}
);
},
(error) => {
return error;
}
);
return ;
}
В моем сервисе я выдаю ошибку, используя следующее:
if (alreadyExist) {
let error = "user already exist in database";
return Observable.throw(error);
}
Теперь я ожидаю, что этот метод выдаст ошибку:
expect( function(){ app.onSubmit(); } )
.toThrow(new Error("User already exist in database"));
Насколько я понимаю, этот тестовый пример должен быть успешным, но я получаю ошибку ниже после сбоя моего тестового примера:
Ожидаемая функция, которая выдаст исключение.
Я попробовал несколько ожидаемых блоков:
expect(app.onSubmit()).toThrowError(new Error("User already exist in database"));
но по-прежнему не добивается никакого успеха.
какие-либо входные данные?
Спасибо
Ответ №1:
Дело в том, Observable.throw
что на самом деле он не выдает никакой ошибки. Даже если бы это произошло, это было бы обработано внутренне. expect().toThrowError
улавливает только исключения, которые не являются handle и которые всплывают для проверки.
Вместо этого Observable.throw
передается ошибка в onError
обратный вызов. Итак, что вам следует сделать вместо этого, это подписаться на вызов и проверить ошибку в обратном вызове
it('..', async(() => {
app.onSubmit().subscribe(
() => {
fail('expected error');
},
(error) => {
expect(error).toBe('user already exist in database');
});
}))
Комментарии:
1. попробовал это… но в нем говорится, что одна из переменных моего экземпляра не определена .. думал, я инициализировал ее как app.edit= false.ошибка такова:
cannot read property edit of undefined
. @peeskillet2. Можете ли вы опубликовать полный, минимальный тест, который воспроизводит проблему
3.
fail()
Функция больше официально не поддерживается Jest.