【问题标题】:Jasmine testing methods inside .done or .then.done 或 .then 中的 Jasmine 测试方法
【发布时间】:2016-03-08 10:45:00
【问题描述】:

想知道是否有人可以帮助我 - 我正在尝试使用 Jasmine (1.3) 测试我的 js,但我无法找出在 .then 或 .done 方法中测试任何方法调用的最佳方法。

示例代码说明:

Backbone.View.extend({

 myMethod: function () {
   this.something.done(function () {
    this.doSomethingElse();
   }.bind(this));
  }

 })

我想编写一个测试来检查 this.doSomethingElse 是否被调用。

我正在查看 jasmine.async 和 waitsFor/runs 设置,但我不确定它如何适合外部代码,即我不会在我的实际代码中调用 done() 来让我的测试工作.另外,如果我在 this.something 上模拟 done 方法,那么我就不再测试实际的实现了,对吧?

我只是想念事物如何组合在一起。如果有人能指出我正确的方向,我将不胜感激!

更新:根据下面的反馈,我现在尝试了以下方法

嘿,感谢您的回答 - 我想也许我没有正确的最后一部分 - 尝试了 2 种不同的方法,都是初始通过,但在一两秒后失败。

   it('calls doSomethingElse on done',function () {
     var mockDeferred = $.Deferred();

      myView.something = mockDeferred;
      spyOn(myView,'doSomethingElse');
      mockDeferred.resolve();

    waitsFor(function () {
      expect(myView.doSomethingElse).toHaveBeenCalled();
    });

  });

还有:

it('calls doSomethingElse on done',function () {
  var mockDeferred = $.Deferred(),
      someTrigger = false;

  myView.something = mockDeferred;
  spyOn(myView,'doSomethingElse');

  runs(function () {
    mockDeferred.resolve();
    someTrigger =  true;
  });

  waitsFor(function () {
    someTrigger =  true;
  });

  runs(function () {
    expect(myView.doSomethingElse).toHaveBeenCalled();
  });


});

在这两种情况下,测试最初都会通过,但在一两秒后超时失败。

我错过了什么吗?

【问题讨论】:

    标签: javascript testing jasmine


    【解决方案1】:

    要测试您描述的示例函数,我会在您的测试中执行以下操作

    • 创建一个新的延迟对象(我称之为mockDeferred
    • mockDeferred 传递到您的测试代码中,以便在您的示例中它现在是this.something
    • 监视doSomethingElse 函数
    • 致电myMethod()
    • 致电resolve()mockDeferred
    • 断言doSomethingElse 被调用

    根据 OP 的更新进行编辑:

    在您的任何一个示例中,我都没有看到您在测试中调用myView.myMethod() 的任何地方;确保你这样做。我举了一个例子,你可以参考here

    顺便说一句,我对您最初尝试通过的第二个示例感到惊讶。可能是因为您在 runs() 块之外有一些代码?

    【讨论】:

    • 感谢您的评论已用我如何尝试您的方法更新了上述问题。超时后两种方式都失败了,所以如果您有任何反馈,我将不胜感激!
    • 抱歉,回复迟了,请查看我的更新答案,如果有帮助,请告诉我!
    【解决方案2】:

    相关问题

    监视.then 中的方法并期待.toHaveBeenCalled 失败

    解决方案

    fakeAsync 内运行测试并在expect 之前运行tick()

    服务:

    getFirebaseDoc() {   
      this.db.firestore.doc('some-doc').get()
        .then(this.getFirebaseDocThen)
        .catch(this.getFirebaseDocCatch);
    }
    

    单元测试:

    it('should call getFirebaseDocThen', fakeAsync(() => {            // note `fakeAsync`
        spyOn(service, 'getFirebaseDocThen');
        spyOn(service.db.firestore, 'doc').and.returnValue({
          get: (): any => {
            return new Promise((resolve: any, reject: any): any => {
              return resolve({ exists: true });
            });
          },
        });
        service.getFirebaseDoc();
        tick();                                                       // note `tick()`
        expect(service.getFirebaseDocThen).toHaveBeenCalled();
    }));
    

    【讨论】:

      猜你喜欢
      • 2016-06-07
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      相关资源
      最近更新 更多