2016-03-08 38 views
1

想知道是否有人可以帮助我 - 我试图测试我的js使用茉莉花(1.3),我无法弄清楚测试任何方法调用的最佳方法。然后或者.done方法。茉莉花测试方法.done或.then内

示例代码解释:

Backbone.View.extend({ 

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

}) 

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

我四处寻找jasmine.async和waitsFor/runs的设置,但我不确定它是如何适应外部代码的,即我不打算在我的实际代码中调用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(); 
    }); 


}); 

在两种情况下,测试将通过原本,但后超时失败后一秒或2.

我错过了什么?

回答

1

要测试你描述的例子功能,我会做以下测试内:

  • 创建一个新的Deferred对象(我称之为mockDeferred
  • mockDeferred到你的代码根据测试,以便它现在this.something是你的榜样
  • 间谍在doSomethingElse功能
  • 呼叫myMethod()
  • 呼叫resolve()mockDeferred
  • 断言doSomethingElse是基于OP的更新叫

编辑:

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

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

+0

感谢您的评论已更新上述问题与我已经尝试过你的方法。这两种方式在超时后都失败了,所以如果你有任何反馈,我会很感激! –

+1

对不起,迟到的回复,查看我更新的答案,并让我知道如果有帮助! –