Я пишу тесты с использованием Жасмина для моего углового приложения. Все тесты проходят. Мой класс выглядит следующим образом:Жасмин: проверка функции, возвращающей обещание
class xyz implements ng.IComponentController {
private myList: ng.IPromise<MyList[]> ;
//declare necessary variables
/* @ngInject */
constructor(private ListService: ListService,
) {
this.myList = this.ListService.getList();
}
public onChange(): void {
this.isNameUnique(this.name).then(function(unique){
scope.isUnique = unique;
scope.errorNameInput = !reg.test(scope.name) || !scope.isUnique;
scope.myFunction({
//do something
});
});
}
public isNameUnique(name: string): ng.IPromise<boolean> {
return this.myList
.then(
(names) => {
_.mapValues(names, function(name){
return name.uuid.toLowerCase();
});
return (_.findIndex(names, { uuid : uuid.toLowerCase() }) === -1) ? true : false;
});
}
}
Здесь я использую ListService предварительно заполнить свой список в самом конструкторе (так он называет службу только один раз). Затем, в моем методе onChange, я проверяю , если имя уникально или нет. IsNameUnique возвращает логическое обещание. Теперь я пытаюсь получить 100% -ый охват моего теста. Я запутался в тестировании метода isNameUnique. Мой первый тест:
(Предполагается, что MyList является JSON похож на ответ я получу от службы)
this.$scope.myFunction = jasmine.createSpy('myFunction');
it('should ...', function() {
this.view.find(NAME_INPUT).val('blue').change(); // my view element.
this.getList.resolve(myList);
this.controller.isNameUnique('blue').then(function (unique) {
expect(unique).toEqual(false); //since blue is already in my json
expect(this.controller.errorNameInput).toEqual(true); //since its not unique, errornameinput will be set to true
expect(this.$scope.myFunction).toHaveBeenCalled();
});
});
Я ожидал бы это испытание, чтобы покрыть линию: scope.errorNameInput = !reg.test(scope.name) || !scope.isUnique
и вызов myFunction()
, но она по-прежнему показывает непокрытой. Не знаю, почему.
Пожалуйста, дайте мне знать, если вы видите что-то еще неправильное, так как я совершенно новый для Углового и Жасмина. Благодарю.
Я думал, что обещание уже разрешается, поэтому его дает правильный результат для уникальности и проходит тест. Позвольте мне прочитать об этом. Благодарю. –
Легко проверить, что теория вашего обещания разрешающая - просто вытащите 'console.log()' в свой 'then()' и посмотрите, попадает ли он в ваш тест :) –
Вот более подробная статья для Angular 1.x (тот же принцип все еще применяется): http://www.bradoncode.com/blog/2015/07/13/unit-test-promises-angualrjs-q/ –