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

标签 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();
        } );
    } );
} );

这很简单。我正在尝试测试 service 的方法 getData。所有变量都已就位,没有控制台错误。

语句 console.log( promise ) 在控制台上打印如下内容:

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

这意味着 promise 是一个有效的 Promise 对象。但这里的问题是我无法测试这个 promise 返回的数据。当我在 promise 对象上调用 then 并在任何处理程序中调用 done 函数时(thencatch、或 finally),控件不会进入其中任何一个,并且测试运行器超时。

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

我也尝试增加默认超时,但这使得测试被跳过。另一方面,如果我尝试同步执行此案例(不使用 done),它会成功通过。

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

最佳答案

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 promise 断言。

关于javascript - Jasmine - 无法获得异步调用的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49938541/

相关文章:

Javascript 格式日期/时间

javascript - 语法错误: Unexpected token < in JSON Aurelia

javascript - 返回结果作为 Typescript 中的 promise

javascript - 第一次迭代后, Angular ng-grid 选定的项目为空白

angularjs - GruntJS usemin 不在子文件夹中查找

javascript - 外部 promise 需要等待内部嵌套 promise

javascript - Bluebird promise 范围

javascript - Jquery 不适用于 javascript insideHtml

javascript - Node.JS ajax 替换现有 JSON 数据

javascript - 创建元素后添加CSS