我有以下代码,它返回成功或不成功的承诺的状态:
$q.settled = function settled(promise) {
return $q.when(promise).then(function(value) {
return { state: 'fulfilled', value: value };
}, function (reason) {
return { state: 'rejected', reason: reason };
});
}
然后我测试成功方法如下:
var result = '',
promise = {
success: function() {
var deferred = $q.defer();
deferred.resolve();
return deferred.promise;
}
};
$q.settled(promise).then(function(data) {
result = data;
});
$rootScope.$digest();
expect(result.success.state).toBe('fulfilled');
我认为这个拒绝几乎相同,主要是将.resolve()
更改为.reject()
var result = '',
promise = {
failed: function() {
var deferred = $q.defer();
deferred.reject();
return deferred.promise;
}
};
$q.settled(promise).then(function(data) {
result = data;
});
$rootScope.$digest();
expect(result.failed.state).toBe('rejected');
但这总是返回fulfilled
。我试过抛出一个错误,或者传递一个字符串而不是一个响应但是测试只是返回undefined。任何想法我如何强迫这个例子正确拒绝?
答案 0 :(得分:1)
我认为您可以将代码修改为以下内容:
SUCCESS
var result = '',
promise = (function() {
var deferred = $q.defer();
deferred.resolve();
return deferred.promise;
})();
promise.then(function(data) {
result = data;
});
$rootScope.$digest();
expect(result.success.state).toBe('fulfilled');
FAILURE
var result = '',
promise = (function() {
var deferred = $q.defer();
deferred.reject();
return deferred.promise;
})();
promise.then(undefined, function(data) {
result = data;
});
$rootScope.$digest();
expect(result.success.state).toBe('rejected');
如果有效,请告诉我。
答案 1 :(得分:0)
如评论中所述,$q.settled(promise){ ...
应该抛出语法错误。我猜你的意思是
$q.settled = function settled(promise){
return $q.when(promise).then(function(value) {
return { state: 'fulfilled', value: value };
}, function (reason) {
return { state: 'rejected', reason: reason };
});
}
测试看起来应该是这样的,我猜是(未经测试)
describe('Testing $q.settled()', function(){
it('should be fulfilled', function(done) {
$q.settled( $q.resolve('success') ).then(function(data){
expect(data).toEqual({
state: 'fulfilled',
value: 'success'
});
done();
});
});
it('should should be rejected', function(done) {
$q.settled( $q.reject('error') ).then(function(data){
expect(data).toEqual({
state: 'rejected',
reason: 'error'
});
done();
});
});
})