Unit testing 在AngularJS中对配置阶段进行单元测试

Unit testing 在AngularJS中对配置阶段进行单元测试,unit-testing,angularjs,angular-ui-router,Unit Testing,Angularjs,Angular Ui Router,我试图学习如何为AngularJS编写单元测试。我从一开始就开始了 angular.module(…).config(…) 我想测试一下配置里面有什么。以下是相关部分的外观: angular.module('ogApp',['ngCookies','ui.router','ogControllers','ogServices','ogDirectives','ogMetricsData'])) .config([ “$stateProvider”、“$locationProvider”, 函数(

我试图学习如何为AngularJS编写单元测试。我从一开始就开始了

angular.module(…).config(…)

我想测试一下配置里面有什么。以下是相关部分的外观:

angular.module('ogApp',['ngCookies','ui.router','ogControllers','ogServices','ogDirectives','ogMetricsData']))
.config([
“$stateProvider”、“$locationProvider”,
函数($stateProvider,$locationProvider){
$stateProvider。
状态('登录'{
templateUrl:'connect.html'
}).state('添加视图'{
templateUrl:“添加视图.html”
}).state('仪表板'{
templateUrl:'dashboard.html'
});
$locationProvider。
HTML5模式(true)。
hashPrefix(“!”);
}
]);
我认为测试这段代码最简单的方法是为
$stateProvider
$locationProvider
注入mock。然后执行配置阶段。然后,断言
$stateProvider
$locationProvider
的外观

如果我的想法是正确的,那么我的问题是,我不知道如何将这些模拟注入模块并从测试执行其配置阶段

您能告诉我如何测试此代码吗?

您可以使用
createSpy
createSpyObj
创建模拟服务,以及
angular mocks.js
来注入它们

有关注入模拟的更多说明,请参见此处:

在我为我的指令撰写的文章中,您可以看到以下内容:

  • 第9行包括来自google cdn的角度模拟
  • 第19行和第20行创建一个伪rootScope对象
  • 第21行和第22行创建假q服务
  • 第42行设置提供者向服务中注入假货
  • 第48行实例化具有伪代码的服务(该服务被注入到被测试的指令中)
  • 第53行调用正在测试的方法
  • 第55-59行关于假货状态的断言

以下是如何访问您的提供商进行单元测试:

describe('yourProvider', function () {
    var provider;

    // Get the provider
    beforeEach(module('app', function (yourProvider) {
        // This callback is only called during instantiation
        provider = yourProvider;
    });

    // Kick off the above function
    beforeEach(inject(function () {}));

    it('does its thing', function () {
        expect(provider.someMethod()).toEqual('your results');
    });
});
我还没有想出一个真正简单的方法来注入mock,但是你可以很容易地监视方法,这已经足够接近了。如果您需要从依赖项提供程序的.get()方法返回一个模拟,您也可以使用另一个spy来完成。此示例演示如何返回模拟并设置其他间谍

describe('yourProvider', function () {
    var dependency, mock, provider;

    beforeEach(module('app', function (dependencyProvider) {
        dependency = dependencyProvider;
        mock = jasmine.createSpyObj('dependency', [
            'methodsGoHere'
        ]);
        spyOn(dependency, 'methodName');
        spyOn(dependency, '$get').andReturn(mock);
    }, function (yourProvider) {
        provider = yourProvider;
    });

    beforeEach(inject(function () {}));

    it('does its thing', function () {
        expect(provider.someMethod()).toEqual('your results');
        expect(dependency.methodName).toHaveBeenCalled();
    });

    it('returns the mock from $get', function () {
        expect(dependency.$get).toBe(mock);
    });
});

我会创建一个指向函数的工厂。。。然后在config函数中也调用该函数。这样,您就可以对工厂进行单元测试:

angular.module('ogApp', ['ngCookies','ui.router','ogControllers','ogServices','ogDirectives','ogMetricsData']);

// Configuration factory for unit testing
angular.module('ogApp')
.factory('configuration', configuration);

configuration.$inject = ['$stateProvider', '$locationProvider'];

function configuration($stateProvider, $locationProvider) {
  return {
    applyConfig: function () {
      $stateProvider.
        state('login', {
          templateUrl: 'connect.html'
        }).state('addViews', {
          templateUrl: 'add-views.html'
        }).state('dashboard', {
          templateUrl: 'dashboard.html'
        });
      $locationProvider.
        html5Mode(true).
        hashPrefix('!');
    };
}

// Call above configuration function from Angular's config phase
angular.module('ogApp')
.config([
  '$stateProvider', '$locationProvider',
  function ($stateProvider, $locationProvider) {
    var config = configuration($stateProvider, $locationProvider);
    config.applyConfig();
  }
]);

您可以对配置工厂进行单元测试,并像对任何其他工厂一样注入模拟。

Jason,最后一个链接已断开。另外,我的挑战不是一般地注入模拟依赖项。只需将模拟提供程序注入config block.MK,您就能够找到同样的解决方案吗?我遇到了同样的问题,无法测试指令。@priyabratanda-Nope。但下面有一个新的答案,我还没有研究。你找到合适的解决方案来处理这个问题了吗???@Brune没有。但下面有一个新的答案,我还没有研究过。