2015-04-06 144 views
0

第一次,我正在写一个问题堆栈;) 我有一个问题,以测试$ mdSidenav(角材料组件,见https://material.angularjs.org/)。 在我的控制器我有类似:

$scope.toggleRight = function() { 
    $mdSidenav('right').toggle(); 
}; 

我想对它进行测试。所以在我的测试文件,我创建,首先,这个对象的模拟:

var $mdSidenav = function(test){ 
     return { 
      toggle: function(){ 
       return true; 
      } 
     }; 
    }; 

    beforeEach(inject(function ($controller) { 
     $scope = $rootScope.$new(); 
     createController = function() { 
      return $controller('headerCtrl', { 
       '$scope': $scope, 
       '$mdSidenav': $mdSidenav 
      }); 
     }; 
    })); 

然后我试图对它进行测试:

describe('toggleRight method', function(){ 
     beforeEach(function(){ 
      spyOn($mdSidenav('right'), 'toggle').and.callThrough(); 
     }); 

     it('Should toggleRight open/close', function(){ 
      $scope.toggleRight(); 
      expect($mdSidenav('right').toggle).toHaveBeenCalled(); 
     }); 

    }); 

但人缘发送给我这个错误:

Error: Expected a spy, but got Function.

我希望有人能帮助我。)

回答

1

你可以尝试不同的方法,使用$提供和匿名MODUL e注入模拟。

我使用兴农这里,但你可以切换到适当的茉莉花代码:

var spy = sinon.spy(); 

beforeEach(module(function ($provide) { 
    $provide.value('$mdSidenav', function (v) { 
    return { 
     toggle: spy 
    } 
    }); 
})); 

然后在测试:

sinon.assert.calledOnce(spy); 
+0

泰您的回复!但是什么是'sinon'?我不明白...;) –

+0

Sinonjs.org只是间谍,存根或模拟Javascript的不同方式。您可以使用Jasmine,而不是用Jasmine代码替换sinon的用法。 –