承诺没有被处理 [英] Promise is not being handled
本文介绍了承诺没有被处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用的茉莉花的使用模拟服务,写我的角的应用程序中的单元测试。然而,承诺我试图运行不工作。
I am writing a unit test for my Angular application using Jasmine with a mock service. However, the promise I am trying to run is not working.
这里的服务:
CreateItemController = $controller('CreateItemController', {
ItemService: {
createItem: function(data) {
console.log('Service running');
var defer = $q.defer();
defer.resolve('1');
return defer.promise;
}
测试:
it('should create an item', function() {
var created = false;
$scope.createItem().then(function(response) {
// This is not being run
console.log("We got through");
created = true;
});
expect(created).toBe(true);
})
和最后实际的功能:
$scope.createItem = function() {
var postData = {
name: 'Jeans'
};
return ItemService.createItem(postData).then(function(response) {
// This is not being run
console.log('Promise recieved');
});
}
我在做什么错了?
What am I doing wrong?
推荐答案
您应该嘲笑$ Q服务,使承诺的分辨率为不是异步再在您的测试。
You should mock the $q service so that the resolution of the promise is not async anymore in your test.
有没有点测试$ Q服务本身,你只是想测试你的自定义逻辑。
There is no point testing the $q service itself, you only want to test your custom logic.
describe('controller: CreateItemController', function () {
var subject, $scope;
beforeEach(module('myModule'));
beforeEach(inject(function ($rootScope, $controller, $q) {
$scope = $rootScope.$new();
subject = $controller('CreateItemController', {
$scope: $scope,
ItemService: {
createItem: function () {
var defer = $q.defer();
spyOn(defer.promise, 'then').andCallFake(function (callback) {
callback();
return this;
});
return defer.promise;
}
}
});
}));
it('should create an item', function () {
var created = false;
var subject = $scope.createItem().then(function () {
created = true;
});
//deferred.resolve('1'); // useless as our callbacks are called as soon as they are registered
expect(created).toEqual(true);
});
});
如果你想的保持延迟虽然,你可以调用$ $范围内解决的递延对象如下申请后():
If you want to keep the delay though, you could call $scope.$apply() after resolving the deferred object as follow:
describe('controlle: stack overflow', function () {
var subject, $scope, deferred;
beforeEach(module('myModule'));
beforeEach(inject(function ($rootScope, $controller, $q) {
$scope = $rootScope.$new();
subject = $controller('CreateItemController', {
$scope: $scope,
ItemService: {
createItem: function () {
deferred = $q.defer();
return deferred.promise;
}
}
});
}));
it('should create an item', function () {
var expected = {
one: false,
two: false,
};
var subject = $scope.createItem();
subject.then(function () {
expected.one = true;
}).then(function () {
expected.two = true;
});
deferred.resolve();
expect(expected.one).toEqual(false);
expect(expected.two).toEqual(false);
$scope.$apply();
expect(expected.one).toEqual(true);
expect(expected.two).toEqual(true);
});
});
});
这篇关于承诺没有被处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文