Jasmine - 无法获得异步调用的响应

时间:2018-04-20 09:34:47

标签: javascript angularjs promise jasmine karma-jasmine

使用Jasmine对AngularJS服务进行单元测试时,我遇到了一个问题。这是导致问题的测试用例:

describe( '#getData', function () {
    it( 'Gets the data', function ( done ) {
        var promise = service.getData();
        $rootScope.$apply();
        console.log( promise );

        promise.then( function ( resp ) {
            expect( resp ).toEqual( mockData );
            done();
        } ).catch( function () {
            done();
        } ).finally( function () {
            done();
        } );
    } );
} );

这很简单。我试图测试getData的方法service。所有变量都是就地的,没有控制台错误。

语句console.log( promise )在控制台上打印出类似的内容:

Promise{$$state: Object{status: 1, value: Object{status: ..., data: ...}}}

这意味着promise是一个有效的Promise对象。但问题是我无法测试此承诺返回的数据。当我在promise对象上调用then并在任何处理程序(donethencatch)中调用finally函数时,控件不会&# 39;进入其中任何一个并且测试跑步者超时。

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

我也尝试增加默认超时,但这会跳过测试。另一方面,如果我尝试同步执行此情况(不使用done),则成功传递。

如何异步测试测试用例中的响应?

1 个答案:

答案 0 :(得分:1)

AngularJS被设计为在测试中同步,done在这里是不可取的。

$q promise取决于摘要,如果没有摘要,promise链将不会被执行。摘要是在错误的地方触发的,应该是:

it( 'Gets the data', function () {
    var promise = service.getData();

    promise.then( function ( resp ) {
        expect( resp ).toEqual( mockData );
    } ).catch( function (err) {
        throw err;
    } ));

    $rootScope.$apply();
} );

jasmine-promise-matchers可以推荐给Jasmine中的$q承诺断言。