2016-11-23 5 views
1

Я пишу тесты с использованием Жасмина для моего углового приложения. Все тесты проходят. Мой класс выглядит следующим образом:Жасмин: проверка функции, возвращающей обещание

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(), но она по-прежнему показывает непокрытой. Не знаю, почему.

Пожалуйста, дайте мне знать, если вы видите что-то еще неправильное, так как я совершенно новый для Углового и Жасмина. Благодарю.

ответ

0

Вам необходимо позвонить $scope.$digest(), чтобы ваше обещание разрешилось в вашем тесте. Существует удобный учебник, в котором подробно обсуждается это обстоятельство. here

Надеюсь, что это поможет!

+1

Я думал, что обещание уже разрешается, поэтому его дает правильный результат для уникальности и проходит тест. Позвольте мне прочитать об этом. Благодарю. –

+0

Легко проверить, что теория вашего обещания разрешающая - просто вытащите 'console.log()' в свой 'then()' и посмотрите, попадает ли он в ваш тест :) –

+0

Вот более подробная статья для Angular 1.x (тот же принцип все еще применяется): http://www.bradoncode.com/blog/2015/07/13/unit-test-promises-angualrjs-q/ –

Смежные вопросы