Karma Angular 单元测试一个从未解决的承诺

Karma Angular Unit test a promise never being resolved

我正在努力确保我的单元测试用例涵盖承诺从未得到解决的场景,但我遇到了一些问题。

一个代码块值一千个字,所以..

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

一切都很好,测试响应是否符合预期,如果承诺被拒绝,测试也会失败。

但是,如果 promise 根本没有被解决,那么测试通过了,我希望它失败。我像这样在 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) 期望值的回调函数永远不会是 运行。但是测试应该会失败,因为删除该行会破坏此函数的目的。

我已经在测试代码中尝试将正向回调设为间谍并期望间谍 toHaveBeenCalled,但这似乎 运行 在 promise 解决之前失败了,即使我可以看到间谍的功能运行 通过控制台日志。

我也曾尝试在单元测试中将 promise 放入一个变量中,然后 expect(promise.$$state.status).toEqual(1),但在解决 promise 之前,这种期望似乎又是 运行,因此测试失败什么时候应该过去。

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

原来的问题是,在处理 $httpBackend 时,您必须 flush() 后端才能使请求通过。我在每个测试周围的 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);
});