想知道是否有人可以帮助我 - 我正在尝试使用 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();
});
});
在这两种情况下,测试最初都会通过,但在一秒或两秒后超时失败。
我错过了什么吗?
最佳答案
为了测试您描述的示例函数,我将在您的测试中执行以下操作:
- 创建一个新的延迟对象(我称之为
mockDeferred
) - 将
mockDeferred
传递到您的测试代码中,这样它现在就是您示例中的this.something
- 监视
doSomethingElse
函数 - 调用
myMethod()
- 在
mockDeferred
上调用resolve()
- 断言
doSomethingElse
被调用
根据 OP 的更新进行编辑:
在您的两个示例中,我都没有看到您在测试中调用 myView.myMethod()
的地方;确保你这样做。我举了一个例子,你可以引用 here .
顺便说一句,我很惊讶你尝试的第二个例子最初通过了。也许是因为您在 runs()
block 之外有一些代码?
关于javascript - .done 或 .then 中的 Jasmine 测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35865248/