【发布时间】:2015-04-15 04:59:49
【问题描述】:
我有一个工厂函数直接返回 http 承诺(它大约 3 层深,我根本不关心路径和返回的内容)
看起来像这样:
user.create()
.success(function(result){})
.error(function(err){})
我只想模拟成功和错误位。我曾尝试使用 $q 并解决或拒绝它,但这似乎不适用于成功和错误。
我的带有 q 的模拟工厂如下所示:
var user = {
create: function (email) {
var deferred = q.defer();
deferred.resolve();
return deferred.promise;
}
};
这几乎就是我想要使用的。有没有办法 q 可以返回成功和错误而不是 then?
这样可以执行代码(我基于 $http 源代码),但不确定如何使用它测试逻辑
var factory = {
factoryFunction: function () {
var deferred = q.defer();
//You can test that it was called here
deferred.resolve();
var promise = deferred.promise;
promise.success = function (fn) {
//Both success and error get called... be careful
return promise;
};
promise.error = function (fn) {
//Both success and error get called... be careful
return promise;
};
return promise;
}
};
【问题讨论】:
-
我们永远不需要从工厂返回承诺。你能说出这种情况吗,就像你采用这种方法的原因一样?你到底想让工厂做什么?
-
@manasisakare 这完全是错误的。当然,服务会返回承诺。
-
我会重构调用代码并将返回的承诺视为常规承诺而不是 HTTP 承诺。注意 $q 有一个
.when()方法,它返回一个已解决的承诺。
标签: angularjs unit-testing mocking