2016-02-03 3 views
1

Так я пытался получить обещания работать в моих угловых тестах приложений, может кто-нибудь понять, что им делать неправильно здесь продолжает возвращаться:

Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test. 

Я не знаю, если это $ q.

FYI я также попытался it('test', function(done){... done();})

контроллер

(function() { 
    'use strict'; 

    angular 
     .module('controller.editor', []) 
     .controller('EditorController', EditorController); 

    function EditorController($scope, $q) { 
     var vm = this; 

     angular.extend(vm, { 
      hack: hack 
     }); 

     function hack(bool) { 
      return $q(function(resolve, reject) { 
       if (bool) { 
        resolve(true); 
       } 

       reject(false); 
      }); 
     } 
    } 
}); 

Test

describe('EditorController', function() { 
    var vm, scope, $controller, $rootScope, $injector; 

    beforeEach(function() { 
     module('app'); 

     //Inject 
     inject(function(_$injector_) { 
      $injector = _$injector_; 
      $controller = $injector.get('$controller'); 
      $rootScope = $injector.get('$rootScope'); 

      // Create new scope object 
      scope = $rootScope.$new(); 

      // Bind the controller 
      vm = $controller('EditorController', { 
       $scope: scope 
      }); 
     }); 
    }); 

    describe('#addCustom', function() { 
     it('test', function(done) { 
      var aHack = vm.hack(true); 

      aHack.then(function(bool){ 
       // Resolve 
       expect(bool).to.be.eq(true); 
       done(); 
      }, function() { 
       // Reject 
       expect(bool).to.be.eq(false); 
       done(); 
      }); 
     }); 
    }); 
}); 
+0

Пожалуйста, убедитесь, что текст точно описывает текущую ситуацию. С опубликованным фрагментом вы действительно получаете сообщение «Ошибка: превышен превышение 2000 мс. Убедитесь, что в этом тесте вызывается обратный вызов done(). '? Вы не используете 'done' в любом месте вашего набора фрагментов. – sgtdck

+0

вернуть обещание должно быть одинаковым, но я его обновил –

ответ

1

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

Это делает код более удобным для чтения и обслуживания.

Это также меньше подвержено ошибкам; выполнение утверждений в .then() является анти-шаблоном, потому что если обратный вызов никогда не вызывается, ваши утверждения никогда не будут выполняться.

Чтобы использовать угловой способ тестирования, вы должны:

  1. удалить done
  2. сделать $rootScope.$digest() в тесте, чтобы решить обещания
  3. сделать ваши утверждения

Применяя это к вашему код будет:

describe('#addCustom', function() { 
    it('test', function() { 
     var __bool = false; 
     var aHack = vm.hack(true).then(function(bool) { 
      __bool = bool; 
     }); 

     $rootScope.$digest(); 

     expect(__bool).to.be.eq(true); 
    }); 
}); 

Но это сложно, потому что $rootScope.$digest решает только $q обещания, не все обещания, особенно не обещание, созданное с помощью Promise() конструктора из различных ES5 прокладок, увидеть это:

Promise resolved too late in angularjs jasmine test

Смотрите также:

http://brianmcd.com/2014/03/27/a-tip-for-angular-unit-tests-with-promises.html

-1

Проблема в том, что ваше обещание не будет решена, прежде чем вы настроите свой «, то поведение.

Посмотрите на these examples, что все используют setTimeout.

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