Javascript 强迫承诺在业力中拒绝

Javascript 强迫承诺在业力中拒绝,javascript,angular,karma-jasmine,angular-promise,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 };

我有以下返回成功或不成功承诺状态的代码:

$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 = (function() {
        var deferred = $q.defer();
        deferred.resolve();
        return deferred.promise;
    })();


promise.then(function(data) {
    result = data;
});

$rootScope.$digest();
expect(result.success.state).toBe('fulfilled');
失败

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');

请让我知道这是否有效

如评论中所述,
$q.solited(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 };
    });
}
我猜测试应该是这样的
(未测试)


我认为即使在您的代码中,您也可以使用undefined作为.then()的第一个参数。我认为它应该测试得很好。
$q.settled(promise){…
不是有效的方法声明。JS应该唠叨
there.yes sorry@Thomas you's right,我对函数进行了编辑,略去了一些对这件事没有帮助的无意义的东西,我把它打错了,很好spot@gardni已编辑以下答案以更正引用的错误。我们是否应该猜测$q.SELLED是什么?问题需要根据上面的@Thomas comment编辑答案。这是真的您不能调用$q.solited()。我想您可能指的是$q.all()?这是一个添加到$QT的装饰函数,但coverage似乎认为我从未进入
函数(reason){return{state:'rejected',reason:reason};});
即使它返回被拒绝的状态。@gardni我用JS编写测试已经有一段时间了。
但coverage似乎认为我从来没有进入过…
你能解释一下/详细说明一下吗。谁确切地说了什么?编辑:拒绝测试中有一个错误,
值:…
而不是
原因:…
;修复了它。我告诉我们e cobertura coverage report,它强调拒绝方法永远不会被命中,所以我猜测试通过了,因为它只是创建了一个拒绝,返回一个“拒绝”状态和一个“错误”原因,所以看起来它通过了,而实际上它没有运行codeOK.Sry,但这超出了我目前的知识范围。需要构建举个例子,做一些测试来让我的头脑清醒起来。@Gardni我不确定cobertura是否没有得到
$q.solited()
不能返回被拒绝的承诺。如果你将模式从
$q.when(promise)更改为
$q.when(promise),那么(a,b)
$q.when(promise)。然后(a)。catch(b)
但这完全是胡乱猜测。
$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();
        });
    });
})