我在使用 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
函数时(then
、catch
、或 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/