我正在使用 Material 设计来构建一个有 Angular 的应用程序。我正在使用$ mdSidenav服务来玩sidenav,它应该能够根据用户的需求打开和关闭。

我围绕它创建了一个包装服务,如下所示:

(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为其编写单元测试时,就会出现问题。我通常创建 stub 或 spy 来模拟我的依赖关系,但由于使用$ mdSidenav的方法很奇怪,因此无法完成它:$ mdSidenav(sidenav-id)。

通常,使用Jasmine来监视您需要的对象和要模拟的功能。运气好的话,我尝试了几种不同的可能性。

我的目标类似于:
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();
});

有办法测试吗?

最佳答案

我对 Material 设计库不熟悉,但是$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;
              };
})

10-05 18:49