如何对$mdSidenav服务进行单元测试?

5

我正在使用Material Design构建一个Angular应用程序。我正在使用$mdSidenav服务来操作一个侧边栏,该侧边栏应该能够随着用户的需求打开和关闭。

我已经创建了一个包装器服务,如下所示:

(function () {
  'use strict';

  angular
    .module('app.layout')
    .factory('navigationService', navigationService);

  navigationService.$inject = ['$mdSidenav'];

  function navigationService($mdSidenav) {
    var factory = {};        
    factory.toggle = toggle;
    return factory;

    //////////

    function toggle() {
      $mdSidenav('left').toggle();
    }
  }
}());

迄今为止一切都很顺利,并且它可以正常工作。问题在于当我使用Jasmine编写单元测试时,我尝试使用存根(stubs)或者间谍(spies)来模拟我的依赖项,但是由于奇怪的使用方式:$mdSidenav(sidenav-id),我无法完成这个任务。
通常,在Jasmine中要使用间谍(spy),你需要一个对象和你想要模拟的函数。我已经尝试了几种不同的可能性,但是都没有成功。
我的目标是类似以下的内容:
beforeEach(module(function ($provide) {
  mdSidenav = {};
  mdSidenav.toggle = jasmine.createSpy();
  $provide.value('$mdSidenav', mdSidenav);
}));

beforeEach(inject(function(_navigationService_) {
  navigationService = _navigationService_;
}));

it('Should call $mdSidenav toggle when required', function() {
    // act
    navigationService.toggle();
    // assert
    expect(mdSidenav.toggle).toHaveBeenCalled();
});

有没有一种方法可以测试这个?
1个回答

6

我不熟悉Material Design库,但看起来$mdSidenav返回的是一个函数。

你为什么不替换:$provide.value('$mdSidenav', mdSidenav);

$provide.factory('$mdSidenav', function() { 
      return function(direction){//if you use direction ('left' in your example) you could use it here
                 return mdSidenav;
              };
})

1
成功了!我从来没有想过制作一个实际上是函数的工厂。谢谢! :) - jbernal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接