如何在 Angular 单元测试中检查对象是否是 promise?

How to check if object is promise in Angular unit tests?

我想要一个断言来检查调用方法返回的对象是否是一个承诺。

是否足以检查它是否存在并具有 then 方法?
或者有没有更好的方法来做到这一点,因为 then 方法不能保证对象是 $q 延迟承诺?

编辑:
问题不是“Any way to know if a variable is an angularjs promise?”的重复项。
该问题的解决方案是确保使用 $q.when().
返回承诺 我问的是如何知道一个对象是一个 promise,而不是如果不是的话如何使它成为一个 promise。

谢谢。

据我所知,没有办法直接这样做。 构建对象时,我通常是这样操作的:

function Derp(){
   this.constructor = Derp;
}
Derp.prototype.method = function(){};

这样我就可以:

expect( new Derp() instanceof Derp ).toBe(true);

但在 $q.promise 和 $q 本身中,除了 __proto__ 中的构造函数 属性(在 chrome 中),没有构造函数或原型属性对象;甚至那些只是指向 JavaScript 的基本对象。

因此,为了测试某物是否是一个 promise,您必须假设您要返回的对象是一个基于其其他属性的 promise:

expect(typeof result.when).toBe('function');
expect(typeof result.then).toBe('function');

我也不喜欢,但这是我能想到的唯一方法。