在angularjs中,在测试服务时,我想检查返回的对象是否是Promise。
现在我正在做以下事情 -
obj.testMethod()
.should.be.instanceOf($q.defer());
答案 0 :(得分:12)
测试对象是否是一个承诺很简单:
return !!obj.then && typeof obj.then === 'function';
就是这样。如果一个对象有then
方法,那就是一个承诺。
看起来棱角分明的$ q没有任何东西可以区别于其他类型的承诺。
答案 1 :(得分:8)
在$ q(https://github.com/angular/angular.js/blob/master/src/ng/q.js#L248)的源代码中查看第248行,实际上没有一个检查可以确定。这将是你最好的选择
var deferred = method();
if(angular.isObject(deferred) &&
angular.isObject(deferred.promise) &&
deferred.promise.then instanceof Function &&
deferred.promise["catch"] instanceof Function &&
deferred.promise["finally"] instanceof Function){
//This is a simple Promise
}
如果承诺实际上是一个你可以使用new Promise()
的函数,那么你就可以使用promise instanceof Promise
,但它是一个对象,所以它没有任何特殊的标识符,唯一的东西你可以测试他们的属性。
修改强>:
要测试“HttpPromise
”,您可以添加error
服务(https://github.com/angular/angular.js/blob/master/src/ng/http.js#L726)中定义的success
和$http
支票。 :
var promise = $http(...);
if(angular.isObject(promise) &&
promise.then instanceof Function &&
promise["catch"] instanceof Function &&
promise["finally"] instanceof Function &&
promise.error instanceof Function &&
promise.success instanceof Function){
//This is a HttpPromise
}
<强> EXTRA 强>:
如果您注意到$ http实际上没有返回deferred
,它会返回直接的承诺,如果您按照调用它实际返回$q.when(...)
并添加了几个函数。您可以看到$q.when
未返回deferred
,而是返回$q.deferred().promise
,因此$http(...)
永远不会$q.deferred()
另外,如果您要运行您发布的测试,我希望您收到此错误:
TypeError: Expecting a function in instanceof check, but got #<Object>
答案 2 :(得分:0)
您可以模拟$http
并让它返回您创建的对象。然后,您可以检查您的服务是否返回该对象。
答案 3 :(得分:0)
我正在使用回调,我需要在click事件上添加CTA才能触发函数并确定触发了哪种类型的回调,这是一些简单的示例。
let fn = function () { alert('A simple function') };
let cta = fn();
console.log(cta instanceof Promise);
// logs false
新的承诺示例
let fn = function () {
return new Promise(function (accept, reject) {
accept();
// reject();
});
};
let cta = fn();
if(cta instanceof Promise) {
cta.then(function () {
alert('I was a promise');
});
}
Axios示例1
let fn = function () {
return axios.get('/user');
}
let cta = fn();
if(cta instanceof Promise) {
cta.then(function () {
alert('I was a promise from axios');
});
}
// Triggers alert('I was a promise from axios');
Axios示例2
let fn = function () {
return axios.get('/user').then(response => {
console.log('user response', response.data);
});
}
let cta = fn();
if(cta instanceof Promise) {
cta.finally(function () {
alert('I was a final promise from axios');
});
}
// Triggers alert('I was a final promise from axios');