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

时间:2016-03-08 10:45:00

标签: javascript testing jasmine

想知道是否有人可以帮助我 - 我尝试使用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上模拟完成方法,那么我不再测试实际的实现了,对吗?

我只是想知道事情是如何融合在一起的。如果有人能指出我正确的方向,我真的很感激它!

更新:根据以下反馈,我现在尝试以下

嘿,谢谢你的回答 - 我想也许我没有最后一部分是正确的 - 尝试了两种不同的方式,既有初始通过,但在一秒钟或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秒后超时到失败。

我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

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

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

根据OP的更新进行编辑:

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

顺便说一句,我对你最初试过的第二个例子感到惊讶。也许是因为你有一些runs()块以外的代码?

答案 1 :(得分:0)

相关问题

监视.then内部的方法并期望.toHaveBeenCalled失败

解决方案

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

服务:

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