gpt4 book ai didi

javascript - .done 或 .then 中的 Jasmine 测试方法

转载 作者:行者123 更新时间:2023-11-29 21:32:11 24 4
gpt4 key购买 nike

想知道是否有人可以帮助我 - 我正在尝试使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com