在 Angular/Jasmine 测试中捕获超时设置的变量
Catching variable set in timeout in Angular/Jasmine test
在这个 Angular/Jasmine 示例中,我有一个带有承诺和 $timeout
的控制器。
测试失败,因为 $timeout
中设置的变量未定义。在$timeout
里面设置的其他变量not没有这个问题。
只有这个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);
});
});
给读取变量超时:
it("should be proper after timeout", function(){
expect($scope.notes).toBe(notes);
}, 1000)
答案是:在$scope.apply();
之后使用$timeout.flush()
$scope.$apply();
$timeout.flush();
在这个 Angular/Jasmine 示例中,我有一个带有承诺和 $timeout
的控制器。
测试失败,因为 $timeout
中设置的变量未定义。在$timeout
里面设置的其他变量not没有这个问题。
只有这个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);
});
});
给读取变量超时:
it("should be proper after timeout", function(){
expect($scope.notes).toBe(notes);
}, 1000)
答案是:在$scope.apply();
之后使用$timeout.flush() $scope.$apply();
$timeout.flush();