强迫承诺在业力中拒绝

时间:2017-08-25 15:17:24

标签: javascript angular karma-jasmine angular-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 };
    });

}

然后我测试成功方法如下:

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。任何想法我如何强迫这个例子正确拒绝?

2 个答案:

答案 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();
        });
    });
})