.done 或 .then 中的茉莉花测试方法

Jasmine testing methods inside .done or .then

本文关键字:茉莉花 测试方法 then done      更新时间:2023-09-26

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

示例代码说明:

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

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

我正在环顾 jasmine.async 和 waitsFor/run 设置,但我不确定它如何适应外部代码,即我不会在实际代码中调用 done() 来让我的测试正常工作。另外,如果我在此模拟完成方法,那么我不再测试实际实现,对吧?

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

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

嘿,感谢您的回答 - 我想也许我没有正确的最后一部分 - 尝试了 2 种不同的方法,都是初始通过,但在一秒或 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();
  });

});

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

我错过了什么吗?

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

  • 创建一个新的延迟对象(我称之为mockDeferred
  • mockDeferred传递到待测试的代码中,以便它现在this.something在您的示例中
  • 监视doSomethingElse功能
  • 呼叫myMethod()
  • 拨打resolve() mockDeferred
  • 断言doSomethingElse被称为

根据OP的更新进行编辑:

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

顺便说一句,我很惊讶你最初尝试的第二个例子。也许是因为您在runs()块之外有一些代码?

相关问题

监视.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();
}));