测试方法是否返回Promise

时间:2014-04-15 08:50:35

标签: angularjs unit-testing promise

在angularjs中,在测试服务时,我想检查返回的对象是否是Promise。

现在我正在做以下事情 -

 obj.testMethod()
        .should.be.instanceOf($q.defer());

4 个答案:

答案 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');