AngularJS:在$ httpBackend.flush()之前需要$ digest

时间:2014-05-31 15:05:47

标签: javascript angularjs unit-testing testing jasmine

我正试图解决为什么我需要在$rootScope.$digest()之前调用$httpBackend.flush()来让我的测试通过。

如果我不这样做,我会得到Error: No pending request to flush!

这是我的测试:

it('should post a new task to the server', function() {

    $httpBackend.when('POST', $rootScope.serverRoot + '/task/create').respond({});

    var created = false;

    mockBoardService.addTask({name: 'Add dynamic categories'})
        .then(function(response) {
            created = true;
        }
    );

    $rootScope.$digest();

    $httpBackend.flush();

    expect(created).toBe(true);
})

它正在调用的服务功能:

this.addTask = function(data) {
    return $http.post($rootScope.serverRoot + '/task/create', data);            
}

为什么我需要运行$rootScope.$digest

1 个答案:

答案 0 :(得分:0)

看起来mockBoardService.addTask正在做一些异步工作。如果没有$ digest,它会尝试在异步代码有机会发出请求之前刷新()$ httpBackend请求。 $ digetst()调用让它有时间进行异步工作。正确的方法(使用Jasmine 2.0,在1.3中有点不同)就像是:

it('should post a new task to the server', function(done) {

    $httpBackend.when('POST', $rootScope.serverRoot + '/task/create').respond({});

    var created = false;

    mockBoardService.addTask({name: 'Add dynamic categories'})
        .then(function(response) {
            created = true;
            done();
        }
    );

    $httpBackend.flush();

    expect(created).toBe(true);
})

注意'完成'传入'it'中的函数

请参阅http://jasmine.github.io/2.0/introduction.html#section-Asynchronous_Support