【发布时间】:2015-05-06 21:09:17
【问题描述】:
我刚刚开始使用Angular。我真的很喜欢这个设计,它实际上非常好测试。我似乎无法正常工作的一件事是测试asynchronous services 及其与controllers 的连接。
只是为了确保我确实理解了 Angulars $q,如果我的 service 看起来像这样;
this.AsyncTask = function (params) {
var deferred = $q.defer();
doAsyncStuff(params, function () {
if (iAmReady) {
deferred.resolve("Success");
}
});
return deferred.promise;
};
正如我所见,这基本上做了以下事情。做异步的东西并返回一个承诺(它正在处理异步的东西)。当事件在某个时刻被处理时,“通知”异步任务已完成的 Promise 并返回一些值给它。现在在我的控制器中我会这样做。
MyService.AsyncTask(params).then(function (value) {
if (value) {
$scope.success = value;
}
});
这里控制器指示服务执行 AsyncTask(带有一些参数),.then 告诉服务何时完成异步任务,控制器可以根据该结果执行一些逻辑。
到目前为止一切顺利,这实际上在生产中完全符合我的要求,但是我无法使用 jasmine 对其进行单元测试。
我尝试了很多可能的解决方案(包括 Angulars official example on that 以及 jasmines done 功能),但我似乎无法使其工作,这些是我面临的问题:: p>
- 在我的 服务 中,
expect永远不会被调用(或者更准确地说是过早调用,因为调试时结果是正确的) - 或者当我在模拟控制器中使用茉莉花
done(例如在.then中)时,它总是超时并且永远不会被调用。 - 当使用 Angular 的单元测试示例中描述的方式时,调用
$rootScope.$apply对我没有任何作用,并且再次出现问题 1。
所以,如果您能给我一些关于如何普遍处理此问题的提示,我将非常高兴。
【问题讨论】:
-
你能展示一下你目前的测试吗?
标签: angularjs unit-testing testing asynchronous jasmine