Javascript Jasmine-无法获取异步调用的响应
在使用Jasmine对AngularJS服务进行单元测试时,我面临一个问题。这是导致问题的测试用例: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
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?你能发布它正在做的事情吗?谢谢!这很有魅力。重点是在我们绑定承诺回调后运行摘要。