2015-04-06 185 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的用法。 –