jasmine.clock()。tick()不适用于$ timeout和去抖动,但可以与setTimeout一起使用

清零

下面,我有3个功能完全相同。每一个使用调用不同的方式setTimeoutdelay1()使用setTimeout直接,delay2()用途angularjs$timeoutdelay3()用途lodash debounce他们都工作正常。

当我使用Jasmine测试时会出现问题。setTimeout正常工作与jasmine.clock().tick()方法,但$timeoutdebounce没有

我有兴趣与Jasmine合作进行反跳操作。我知道我可以使用$timeout.flush()与angularjs但$timeoutsetTimeout其他地方给我的问题,在我的代码中,我使用它与单张地图。防弹跳与传单效果很好。

我在这里创建了一个监听器:plnkr,在其中$timeout,当setTimeout测试通过时,您将看到and反跳测试未通过。

有办法解决这个问题吗?谢谢

JS

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope, $timeout) {
  $scope.name = 'World';
  $scope.delayed1 = function(){
    setTimeout(function(){
      $scope.name = "Hello world by setTimeout";
    },500)
  }
  $scope.delayed2 = function(){
    $timeout(function(){
      $scope.name = "Hello world by $timeout";
    },500)
  }
  $scope.delayed3 = function(){
    _.debounce(function(){
      $scope.name = "Hello world by debounce";
    },500)
  }
});

规格

describe('Testing a Hello World controller', function() {
  var $scope = null;
  var ctrl = null;

  //you need to indicate your module in a test
  beforeEach(module('plunker'));

  beforeEach(inject(function($rootScope, $controller) {
    $scope = $rootScope.$new();

    ctrl = $controller('MainCtrl', {
      $scope: $scope
    });
  }));

  it('should say hallo to the World', function() {
    expect($scope.name).toEqual('World');
  });
  it('should say Hello world by setTimeout', function() {
    jasmine.clock().install();
    $scope.delayed1();
    jasmine.clock().tick(600);
    expect($scope.name).toEqual('Hello world by setTimeout');
    jasmine.clock().uninstall();

  });
  it('should say Hello world by timeout', function() {
    jasmine.clock().install();
    $scope.delayed2();
    jasmine.clock().tick(600);
    expect($scope.name).toEqual('Hello world by timeout');
    jasmine.clock().uninstall();

  }); 
  it('should say Hello world by debouce', function() {
    jasmine.clock().install();
    $scope.delayed3();
    jasmine.clock().tick(600);
    expect($scope.name).toEqual('Hello world by debouce');
    jasmine.clock().uninstall();

  }); 
});
杰德·沃德

Jasmine中的时钟仅在您正在测试setInterval()setTimeout()直接运行时才起作用,因为它只是模拟那些专门用于同步运行的功能。我相信有一个Jasmine来模拟Date对象的拉取请求,这将允许像_.debounce()模拟它一样测试功能,但是我不记得它是否被合并了。

要进行测试,_.debounce()您必须模拟它以使其同步运行,最好是作为间谍运行,或者您可以重写该函数。这是我发现对我有用的东西:

spyOn(_, 'debounce').and.callFake(function (func) {
    return function () {
        func.apply(this, arguments);
    };
});

现在,对的调用_.debounce()将同步运行,并且测试应该成功完成。当然,您仍然必须使用$timeout.flush()

我通过以下更改更新了您的监听器:http ://plnkr.co/edit/KXmwcf1faUNf8nlqPeyd

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Angular JS不适用于IE9,但可以与其他浏览器一起使用

来自分类Dev

CSS不适用于IE和Firefox,但可以在Chrome中使用

来自分类Dev

DatagramSocket不适用于Java但可与Javaw一起使用

来自分类Dev

jquery 抖动不适用于 div

来自分类Dev

RavenDB查询不适用于C#,但可以在RavenDB Studio中使用吗?

来自分类Dev

Ruby On Rails回调不适用于Heroku,但可以在本地使用

来自分类Dev

Excpetionmapper不适用于Wildfly Swarm,但可以在Wildfly Server中使用

来自分类Dev

查询不适用于 PHP,但可以直接在 Mysql 中使用

来自分类Dev

setTimeout函数不适用于for循环

来自分类Dev

setTimeout不适用于随机延迟

来自分类Dev

jQuery if和语句不适用于and

来自分类Dev

XPath脚本不适用于输入一,但可以完美地用于输入二

来自分类Dev

JavaScript提交不适用于Chrome / Safari,但可以在Firefox / IE中正常运行

来自分类Dev

Heroku PostgreSQL查询不适用于Heroku,但可以在本地工作

来自分类Dev

JavaScript提交不适用于Chrome / Safari,但可以在Firefox / IE中正常运行

来自分类Dev

onclick事件仅适用于按钮,不适用于与按钮一起使用的glyphicon

来自分类Dev

CSS按钮不适用于超棒的字体,但可以完美地使用十六进制

来自分类Dev

Google Map,样式不适用于带有类的标记img,但可以使用img [src]

来自分类Dev

日期条件不适用于我的应用程序,但可以在SQL Server中使用

来自分类Dev

Google Map,样式不适用于带有类的标记img,但可以使用img [src]

来自分类Dev

截断样式不适用于<a>标签,但适用于<div>和<p>标签

来自分类Dev

$ _POST和$ _GET不适用于var_dump,但适用于日志请求

来自分类Dev

jQuery touch Punch适用于Chrome和Firefox,但不适用于IE

来自分类Dev

jQuery Javascript仅适用于chrome和firefox,不适用于IE

来自分类Dev

Fullcalendar和Bootstrap:回调适用于.modal(),但不适用于.dropdown('toggle')

来自分类Dev

提交按钮不适用于Android,但适用于PC和iPhone

来自分类Dev

datepicker不适用于FF和chrome,但适用于IE

来自分类Dev

jQuery touch Punch适用于Chrome和Firefox,但不适用于IE

来自分类Dev

jQuery验证适用于类,但不适用于规则和消息

Related 相关文章

  1. 1

    Angular JS不适用于IE9,但可以与其他浏览器一起使用

  2. 2

    CSS不适用于IE和Firefox,但可以在Chrome中使用

  3. 3

    DatagramSocket不适用于Java但可与Javaw一起使用

  4. 4

    jquery 抖动不适用于 div

  5. 5

    RavenDB查询不适用于C#,但可以在RavenDB Studio中使用吗?

  6. 6

    Ruby On Rails回调不适用于Heroku,但可以在本地使用

  7. 7

    Excpetionmapper不适用于Wildfly Swarm,但可以在Wildfly Server中使用

  8. 8

    查询不适用于 PHP,但可以直接在 Mysql 中使用

  9. 9

    setTimeout函数不适用于for循环

  10. 10

    setTimeout不适用于随机延迟

  11. 11

    jQuery if和语句不适用于and

  12. 12

    XPath脚本不适用于输入一,但可以完美地用于输入二

  13. 13

    JavaScript提交不适用于Chrome / Safari,但可以在Firefox / IE中正常运行

  14. 14

    Heroku PostgreSQL查询不适用于Heroku,但可以在本地工作

  15. 15

    JavaScript提交不适用于Chrome / Safari,但可以在Firefox / IE中正常运行

  16. 16

    onclick事件仅适用于按钮,不适用于与按钮一起使用的glyphicon

  17. 17

    CSS按钮不适用于超棒的字体,但可以完美地使用十六进制

  18. 18

    Google Map,样式不适用于带有类的标记img,但可以使用img [src]

  19. 19

    日期条件不适用于我的应用程序,但可以在SQL Server中使用

  20. 20

    Google Map,样式不适用于带有类的标记img,但可以使用img [src]

  21. 21

    截断样式不适用于<a>标签,但适用于<div>和<p>标签

  22. 22

    $ _POST和$ _GET不适用于var_dump,但适用于日志请求

  23. 23

    jQuery touch Punch适用于Chrome和Firefox,但不适用于IE

  24. 24

    jQuery Javascript仅适用于chrome和firefox,不适用于IE

  25. 25

    Fullcalendar和Bootstrap:回调适用于.modal(),但不适用于.dropdown('toggle')

  26. 26

    提交按钮不适用于Android,但适用于PC和iPhone

  27. 27

    datepicker不适用于FF和chrome,但适用于IE

  28. 28

    jQuery touch Punch适用于Chrome和Firefox,但不适用于IE

  29. 29

    jQuery验证适用于类,但不适用于规则和消息

热门标签

归档