Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.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
Javascript Jasmine-无法获取异步调用的响应_Javascript_Angularjs_Promise_Jasmine_Karma Jasmine - Fatal编程技术网

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

Javascript Jasmine-无法获取异步调用的响应,javascript,angularjs,promise,jasmine,karma-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

在使用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
方法。所有变量都已就位,并且没有控制台错误

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

Promise{$$state: Object{status: 1, value: Object{status: ..., data: ...}}}
这意味着
promise
是一个有效的promise对象。但这里的问题是,我无法测试这个承诺返回的数据。当我在promise对象上调用
then
并在任何处理程序中调用
done
函数(
then
catch
、或
finally
)时,控件不会进入其中任何一个,测试运行程序超时

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
我也尝试增加默认超时,但这会使测试被跳过。另一方面,如果我尝试同步执行此案例(而不使用
done
),它将成功通过


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

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

$q
承诺依赖于摘要,没有摘要就无法执行承诺链。摘要在错误的位置触发,应该是:

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中的
$q
承诺断言。

您好,您是否尝试将“it”函数处理程序转换为异步函数?您可以使用wait获取service.getData()响应,然后进行验证。请让我知道。@LuizDuarte--由于代码中的技术限制,我不能使用
async/await
。你能用转换后的
it
函数发布一个答案,但不使用async/await吗?好的,我想你可以通过某种方式将它传输到ES5。。。好吧,那么。。。当您将console.log放入Then/Catch(添加arg以获取Catch中的错误)时,它的结果是什么?我这样问是因为console.log肯定会在调用它之后立即返回一个Promise Pending状态。@luizduart——正如我提到的,回调是完全执行的。如果我在
然后
捕获
最后
中登录某个内容,则不会记录任何内容,测试超时并出现错误
错误:超时-在jasmine指定的超时内未调用异步回调。默认超时时间间隔。
。确定。。。也就是说,回调不会被执行,对吧?这是一个愚蠢的问题,但您是否检查过服务.getData()是否正在获取timedout?你能发布它正在做的事情吗?谢谢!这很有魅力。重点是在我们绑定承诺回调后运行摘要。