如何为我的方法编写JASMINE测试用例。一直试图嘲笑事件监听器。请指向链接或提供我的嘲笑

时间:2017-06-01 04:58:37

标签: angularjs jasmine karma-jasmine

尝试为以下代码编写茉莉花测试...

refreshCacheIfNewVersionIsAvailable();

//Check if a new cache is available on page load and reload the page to refresh app cache to the newer version of files
function refreshCacheIfNewVersionIsAvailable() {
    $window.addEventListener('load', function (e) {
        $window.applicationCache.addEventListener('updateready', function (e) {
            if ($window.applicationCache.status == window.applicationCache.UPDATEREADY) {
                // Manifest changed. Now Browser downloadeds a new app cache.
                alert(textService.versioning.newVersionMessage);
                $window.location.reload(true);
            } else {
                // Manifest didn't change. Nothing new to server.
            }
        }, false);
    }, false);
}

1 个答案:

答案 0 :(得分:1)

您的挑战

我认为您面临的挑战是您无法看到如何在回调函数中测试代码。您必须意识到,在窥探addEventListener后,您可以在测试中的服务(refreshCacheIfNewVersionIsAvailable)中执行间谍后访问回调函数。既然你可以获得它的引用,就可以执行它,就好像它是你正在测试的函数一样。

示例解决方案

以下是未经测试的,写在我的头顶,但是如果我必须测试该代码,那么就像我期望写的那样。

describe('refreshCacheIfNewVersionIsAvailable()', function() {
  beforeEach(function() {
    spyOn($window, 'addEventListener');
  });

  it('should register a load event handler on the window', function() {    
    refreshCacheIfNewVersionIsAvailable();

    expect($window.addEventListener.calls.count()).toBe(1);

    var args = $window.addEventListener.calls.argsFor(0);
    expect(args.length).toBe(3);
    expect(args[0]).toBe('load');
    expect(typeof args[1]).toBe('function');
    expect(args[2]).toBe(false);
  });

  describe('load event', function() {
    var loadFunction;

    beforeEach(function() {
      refreshCacheIfNewVersionIsAvailable();
      var args = $window.addEventListener.calls.argsFor(0);
      loadFunction = args[1];

      spyOn($window.applicationCache, 'addEventListener');
    });

    it('should register an updateready event handler in the window application cache', function() {
      loadFunction();

      expect($window.applicationCache.addEventListener.calls.count()).toBe(1);

      var args = $window.applicationCache.addEventListener.calls.argsFor(0);
      expect(args.length).toBe(3);
      expect(args[0]).toBe('updateReady');
      expect(typeof args[1]).toBe('function');
      expect(args[2]).toBe(false);
    });

    describe('updateready event', function() {
      var updateReadyFunction;

      beforeEach(function() {
        loadFunction();
        var args = $window.applicationCache.addEventListener.calls.argsFor(0);
        updateReadyFunction = args[1];
      });

      it('should reload the window if the status is UPDATEREADY', function() {
        // You get the point
      });
    });
  });
});