Unit testing 在AngularJS中对配置阶段进行单元测试
我试图学习如何为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”, 函数(
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没有。但下面有一个新的答案,我还没有研究过。