在Angular / Jasmine测试中捕获变量设置为超时

时间:2017-01-11 17:31:04

标签: angularjs jasmine karma-jasmine jasmine2.0

在这个Angular / Jasmine示例中,我有一个带有promise和$timeout的控制器。

测试失败,因为$timeout中设置的变量未定义。 $timeout内部设置的其他变量没有此问题。

只有这个expect失败,其他人工作:

expect($scope.notes).toBe(notes);

我使用$timeout.flush()等待,但会被忽略。任何想法如何解决这个问题?

PLUNK http://plnkr.co/edit/Jet3KRs7baTIzk8L30JQ

angular.module("mymodule", [])

.service('myHttp', function($http){
    this.call = function($q) {
        var defer = $q.defer();
        $http({url:"gothere"})
              .then(function (response) {
                  defer.resolve(response);
              });
        return defer.promise;
    };
})

.controller('ctl', function($scope,$timeout,myHttp) {
      $scope.read = function (id){
          var data = {};
          data.id = id;
          myHttp.call({url:'/getRecord', data:data})
              .then(function(response) {
                  $scope.id = response.id;
                  $scope.name = response.nm;
                  $scope.descrip = response.dsc;

                  $timeout(function(){
                      $scope.notes = response.nts;
                  },1000);

              });
    };
});



describe('Testing a Controller that uses a Promise', function () {
  var $scope;
  var $q;
  var deferred;

  beforeEach(module('mymodule'));

  beforeEach(inject(function($controller, _$rootScope_, _$q_, $timeout, myHttp) {
    $scope = _$rootScope_.$new();
    $q = _$q_;
    deferred = $q.defer();
    spyOn(myHttp, 'call').and.returnValue(deferred.promise);

    $controller('ctl', { 
      $scope: $scope, 
      $timeout: $timeout,
      myHttp: myHttp
    });

    $scope.read(1)
    $timeout.flush(2000);
  }));

  it('should resolve promise', function () {

    var id = 1;
    var name = "John";
    var descrip = "This is the description";
    var notes = "These are the notes";

    var obj = {
      id: id,
      nm: name,
      dsc: descrip,
      nts: notes
    };

    deferred.resolve(obj);
    $scope.$apply();
    expect($scope.id).toBe(id);
    expect($scope.name).toBe(name);
    expect($scope.descrip).toBe(descrip);
    expect($scope.notes).toBe(notes);
  });

});

2 个答案:

答案 0 :(得分:0)

暂停读取变量:

 it("should be proper after timeout", function(){
      expect($scope.notes).toBe(notes);  
 }, 1000)

答案 1 :(得分:0)

答案是:在$ scope.apply();

之后使用$ timeout.flush()
 $scope.$apply();
 $timeout.flush();