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

标签 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 上模拟 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/

相关文章:

javascript - 使用 jQuery.inArray 在数组中查找项目

node.js - 如何安装 Jasmine Node (理想情况下不使用 'sudo')?

unit-testing - Angular 2 - Jasmine 测试 - 在页面加载时打开模态

javascript - 使用模拟 $resource 在 AngularJS 中进行单元测试

testing - 在非主程序包中运行类似主程序的程序

testing - 如何在 Flutter 中测试渲染对象的固有大小

javascript - Angular 8在cookie中保存数组

javascript - Google map API V3 TrafficLayer 小组件

javascript - 如何在ajax done函数中检索函数变量

scala - 如何在 ScalaTest 中使用来自 Specs2 的 === 语法