2014-11-05 73 views
0

我有這個簽名配置功能:如何在AngularJS中測試配置函數時模擬提供者?

tmsNav = angular.module('tmsNav', ['tmsAuthSvc', 'tmsConfig', 'ui.router']) 
tmsNav.config(function ($stateProvider, $urlRouterProvider, statesConfig) { 
    // uses the constant statesConfig to configure $stateProvider and $urlRouterProvider 
}); 

這裏是我的描述塊:

describe('tmsNav.config() >', function() { 
    it('configures states correctly', function() { 
     module('tmsConfig', function ($provide) { 
      $provide.constant('statesConfig', states1); 
      $provide.factory('$state', function() { 
       return { 
        state: function() { 
         console.log('state()!!!'); 
        } 
       }; 
      }); 
     }); 
     module('tmsNav'); 
     inject(function ($state) { 
      expect($state.get().length).toBe(4); 
     }); 
    }); 
}); 

的不斷成功覆蓋,但$ stateProvider不是。我試過使用$provide.factory('$state', ...),$provide.constant('$stateProvider', ...),$provide.value('$state', ...)等...沒有任何工作。

我需要模擬$ stateProvider,因爲一旦配置它就會保留進入下一個測試的配置。所以當我運行後續測試時,我不應該得到有關重複配置值的錯誤。

回答

2

答案在於module()語句。我試圖在錯誤的模塊上覆蓋$ stateProvider。

module('tmsConfig', function ($provide) { 
    $provide.constant('statesConfig', states1); 
}); 
module('ui.router', function ($provide) { 
    $provide.provider('$state', function() { 
     this.state = function() { 
      console.log('state()!!!'); 
     }; 
     this.$get = function() { 
      return { 
       get: function() { 
        return []; 
       } 
      }; 
     }; 
    }); 
}); 
module('tmsNav'); 

如果我將長度期望值減少到零,則此編輯會使測試通過。這不是我想要的測試,所以我會寫一個更強大的模擬與間諜等,現在提供者問題已解決。

+0

我花了很長時間試圖解決這個問題,只是在發佈問題三分鐘後自己解決它。衛生署! – 2014-11-05 20:38:47

+0

不用擔心它經常發生:) – Whisher 2014-11-05 20:42:59

相關問題