Задаваемая переменная перехвата в тесте Angular/Jasmine
В этом примере Angular/Jasmine у меня есть контроллер с обещанием и $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 ответа
Решение
Ответ таков: используйте $timeout.flush() после $scope.apply();
$scope.$apply();
$timeout.flush();
Дайте время ожидания для чтения переменной:
it("should be proper after timeout", function(){
expect($scope.notes).toBe(notes);
}, 1000)