使用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
并在任何处理程序(done
,then
或catch
)中调用finally
函数时,控件不会&# 39;进入其中任何一个并且测试跑步者超时。
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
我也尝试增加默认超时,但这会跳过测试。另一方面,如果我尝试同步执行此情况(不使用done
),则成功传递。
如何异步测试测试用例中的响应?
答案 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
承诺断言。