Javascript 茉莉花测试方法里面。做了还是。然后

Javascript 茉莉花测试方法里面。做了还是。然后,javascript,testing,jasmine,Javascript,Testing,Jasmine,想知道是否有人可以帮助我-我正在尝试使用Jasmine(1.3)测试我的js,但我不知道测试.then或.done方法中的任何方法调用的最佳方法 要解释的示例代码: Backbone.View.extend({ myMethod: function () { this.something.done(function () { this.doSomethingElse(); }.bind(this)); } }) 我想写一个测试来检查是否调用了this.doSom

想知道是否有人可以帮助我-我正在尝试使用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(),以使测试正常工作。另外,如果我在这个上模拟done方法,那么我就不再测试实际的实现了,对吗

我只是想知道事物是如何结合在一起的。如果有人能给我指出正确的方向,我将非常感激

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

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

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


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

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

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

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

  });

我遗漏了什么吗?

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

  • 创建一个新的延迟对象(我称之为
    mockDeferred
  • mockDeferred
    传递到您的测试代码中,这样它现在就是
    这个了
  • 监视
    doSomethingElse
    功能
  • 调用
    myMethod()
  • mockDeferred
  • 断言调用了
    doSomethingElse
根据OP的更新进行编辑:

在您的两个示例中,我都没有看到您在测试中调用
myView.myMethod()
;一定要这样做。我突然提出了一个你可以参考的例子


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

相关问题

监视
中的某个方法,然后
并期望
被调用
失败

解决方案

fakeAsync
内部运行测试,并在
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();
}));

谢谢你的评论,我更新了上面的问题,告诉你我是如何尝试你的方法的。两种方法都会在超时后失败,因此如果您有任何反馈,我将非常感谢!对于迟来的回复,很抱歉,请查看我的更新答案,如果有帮助,请告诉我!