【问题标题】:Return deferred object for return value Jasmine返回返回值 Jasmine 的延迟对象
【发布时间】: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


【解决方案1】:

这解决了它:

 import Deferred from "dojo/Deferred";

 let deferred = new Deferred();
 fakeTask.execute.and.returnValue(deferred);

这使得对象类型可以识别为延迟类型。

【讨论】:

    猜你喜欢
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多