单元测试基于组件的体系结构中的角度服务

时间:2016-08-04 10:44:09

标签: angularjs unit-testing

我目前的做法是我有两个模块:

  • 信息中心,我保留dashboard组件,
  • 核心我有alertsWarningsData工厂,与后端连接

    我目前的单元测试方法是明确覆盖此服务:

    dashboard.component.js

    angular.
        module('dashboard').
        component('dashboard', {
            controller: DashboardController,
            templateUrl: 'dashboard/dashboard.html'
    });
    
    DashboardController.$inject = ['alertsWarningsData'];
    function DashboardController(alertsWarningsData) {
        var vm = this;
        setAlertsWarnings();
    
    function setAlertsWarnings() {
        return alertsWarningsData.getAlertsWarnings()
            .then(function(data) {
                vm.alertsWarnings = data;
                return data;
            });
    }
    

    dashboard.component.spec.js

    describe('Dashboard component', () => {
        let $componentController;
        beforeEach(module('dashboard'));
        beforeEach(inject((_$componentController_) => {
            $componentController = _$componentController_;
        }));
    
        it(`should exist`, (inject(($q) => {
            // given
            let streamsData = {};
            let alertsWarningsData = {};
            alertsWarningsData.getAlertsWarnings = function() { return $q.defer().promise };
    
            // when
            const dashboardController = $componentController('dashboard', {'alertsWarningsData': alertsWarningsData});
    
            // then
            expect(dashboardController).toBeDefined();
        })));
    });
    

    问题:有没有更好的方法来模拟这项服务?我可以在beforeEach

    中执行此操作
  • 1 个答案:

    答案 0 :(得分:1)

    beforeEach(module('dashboard', ($provide) => {
      $provide.factory('alertsWarningsData', ($q) => ({
        getAlertsWarnings: () => $q.resolve()
      }))
    });
    

    module有一个使用value模拟服务的对象参数,但由于模拟服务应注入$q,因此可以使用$provide

    $controller$componentController可以选择模拟每个控制器的依赖关系,但没有必要使用此功能。