Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 因果报应角度单位测试承诺永远无法解决_Angularjs_Unit Testing_Promise_Q_Resolve - Fatal编程技术网

Angularjs 因果报应角度单位测试承诺永远无法解决

Angularjs 因果报应角度单位测试承诺永远无法解决,angularjs,unit-testing,promise,q,resolve,Angularjs,Unit Testing,Promise,Q,Resolve,我试图确保我的单元测试用例涵盖了承诺永远无法解决的场景,并且我遇到了一些问题 一个代码块抵得上千言万语,所以 it('returns my resource', function() { var myUser = {name:'Bob'} $httpBackend.expectGET('/myresource').respond(200,myUser); myService.getMyUser() .then(function(data) { ex

我试图确保我的单元测试用例涵盖了承诺永远无法解决的场景,并且我遇到了一些问题

一个代码块抵得上千言万语,所以

it('returns my resource', function() {
    var myUser = {name:'Bob'}
    $httpBackend.expectGET('/myresource').respond(200,myUser);
    myService.getMyUser()
    .then(function(data) {
        expect(data).toEqual(myUser);
    },fail);
});
这一切都很好,测试结果表明响应符合预期,如果承诺被拒绝,测试也会失败

然而,如果这个承诺永远无法实现,那么测试就通过了,我希望它失败。我正在myService中缓存此请求,如下所示:

var cachedUser;

function getMyUser(forceUpdate) {
    var deferred = $q.defer();
    if (cachedUser && !forceUpdate) {
        deferred.resolve(cachedUser);
    } else {
        $http.get('/myresource')
        .then(function(data) {
            cachedUser = data;
            deferred.resolve(data);
        },function(error) {
            deferred.reject(error);
        });
    }
    return deferred.promise;
}
现在在上面的场景中,如果要从$http.get中删除行“
deferred.resolve(data)
”,测试仍然会通过。这是因为包含
data.toEqual(myUser)
期望值的回调函数从未运行过。但是,测试应该失败,因为删除该行违背了此功能的目的

我曾在测试代码中尝试将肯定回调设为spy,并期望spy已被调用,但这似乎是在承诺得到解决之前运行的,并且失败了,尽管我可以看到spy的函数是通过控制台日志运行的

我还尝试在单元测试中将承诺放入变量中,然后
expect(promise.$$state.status).toEqual(1)
,但再次出现的情况是,该期望在承诺解决之前运行,因此测试在应该通过时失败


请确保您在回答之前理解了问题,如果我不清楚,请发表评论。

问题是,在处理$httpBackend时,您必须刷新()后端,请求才能通过。我是在每次测试前后的
afterEach()
块中这样做的,因此当尝试从测试块中测试承诺的状态时,承诺实际上还没有得到解决

通过将
$httpBackend.flush()
移动到单元测试中,返回的承诺确实将其状态从0更新为1

以下是最终的单元测试代码:

it('returns my resource', function() {
    var myUser = {name:'Bob'}
    var promise;
    $httpBackend.expectGET('/myresource').respond(200,myUser);
    promise = myService.getMyUser()
    .then(function(data) {
        expect(data).toEqual(myUser);
    },fail);
    $httpBackend.flush();
    expect(promise.$$state.status).toEqual(1);
});

是的,事实上,确切的问题是什么还不够清楚。这个问题没有一个问号。此外,单元测试“承诺永远不会解决”这一短语的含义也不清楚。问题是如何确保单元测试涵盖这样的场景:承诺永远不会解决,这与拒绝承诺不同。$$state.status断言实际上是不必要的。实际问题是缺少
$rootScope.$digest()
。这使得
然后
部件永远不会运行
flush()
也有
$digest()
,这就是它开始工作的原因。在测试中,每个$q承诺链应以
$rootScope.$digest()
结尾。我建议使用,以保持它的安全性和一致性。