【发布时间】:2018-04-12 21:06:29
【问题描述】:
对于我正在测试的 Angular2 组件,我试图在 jasmine 中伪造延迟对象的返回。
组件功能:
public createAndExecuteIdentify(url) {
identifyTask = this._widgetFactory.createIdentifyTask(url); //returns object
return identifyTask.execute(this.identifyParams); //this returns a deferred
}
规格:
let fakeTask: any;
fakeTask = {
execute: jasmine.createSpy('execute'),
url: "bob@bob.com"
};
fakeFactory.createIdentifyTask.and.returnValue(fakeIdentifyTask);
describe("when executing identifyTask", () => {
it("should return the proper object", () => {
let taskReturn = component.createAndExecuteIdentify(fakeTask.url);
expect(taskReturn).toEqual(jasmine.objectContaining({
promise: {}
}));
});
});
这很好用,除了 fakeTask.execute 不返回延迟。
fakeTask.execute() 的期望结果会返回一个像这样的对象:
b.Deferred {promise: {…}, isResolved: ƒ, isRejected: ƒ, isFulfilled: ƒ,
isCanceled: ƒ, …}
addCallbacks: ƒ (a,b)
callback: ƒ (a)
cancel: ƒ ()
errback: ƒ (a)
isCanceled: ƒ ()
isFulfilled: ƒ ()
isRejected: ƒ ()
isResolved: ƒ ()
progress: ƒ (a)
promise: {isResolved: ƒ, isRejected: ƒ, isFulfilled: ƒ, isCanceled: ƒ, then: ƒ, …}
reject: ƒ (a)
resolve:ƒ (a) then: ƒ (b,d,h)
_pendingDfd: b.Deferred {promise: {…}, isResolved: ƒ, isRejected: ƒ, isFulfilled: ƒ, isCanceled: ƒ, …}
__proto__: Object
所以我想知道是否以某种方式设置 fakeTask 的执行间谍以返回 deferred 是否可行? (真实的东西返回一个 Deferred Dojo 类型,如上所示。 http://dojotoolkit.org/reference-guide/1.10/dojo/Deferred.html)
【问题讨论】:
-
fakeTask.execute.and.returnValue(...)?请注意,您的示例似乎使用了不一致的名称,所以不是 minimal reproducible example。 -
是的,它是一个更复杂的组件的一部分,并且有点难以破解。 Angular 的 $q 库看起来很有趣,但不确定是否有 Angular2 的等价物?
-
'fakeTask.execute.and.returnValue(...)' 几乎可以工作。它给了我我需要的对象,但它确实会影响对象类型。所以我得到了错误:TypeError:你提供了一个无效的对象,其中应该有一个流。您可以提供 Observable、Promise、Array 或 Iterable。 在我的真实示例中,对象类型列为 b.Deferred。
标签: angular unit-testing promise dojo jasmine