我正在尝试学习如何为AngularJS编写单元测试。我从一开始就用
开始 angular.module( ... ).config( ... )
我想测试内部配置是什么。以下是相关部分的外观:
angular.module('ogApp', ['ngCookies','ui.router','ogControllers','ogServices','ogDirectives','ogMetricsData'])
.config([
'$stateProvider', '$locationProvider',
function ($stateProvider, $locationProvider) {
$stateProvider.
state('login', {
templateUrl: 'connect.html'
}).state('addViews', {
templateUrl: 'add-views.html'
}).state('dashboard', {
templateUrl: 'dashboard.html'
});
$locationProvider.
html5Mode(true).
hashPrefix('!');
}
]);
我认为测试此代码的最简单方法是为$stateProvider
和$locationProvider
注入模拟。然后执行配置阶段。之后,断言$stateProvider
和$locationProvider
应该是什么样子。
如果我的想法是正确的,我的问题是,我不知道如何将这些模拟注入模块并从测试中执行其配置阶段。
你能告诉我如何测试这段代码吗?
答案 0 :(得分:9)
以下是如何访问您的提供商进行单元测试:
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');
});
});
我还没有想出一个非常简单的方法来注入模拟,但是你可以很容易地监视方法并且足够接近。如果你需要从依赖提供者的$ get()方法返回一个模拟,你也可以和另一个间谍一起做。此示例说明了返回模拟并设置其他间谍。
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);
});
});
答案 1 :(得分:0)
您可以使用Jasmine's createSpy
和createSpyObj
来创建模拟服务,以及
angular-mocks.js
注入它们。
有关注入模拟的更多说明:Injecting a mock into an AngularJS service
在this test我为我的指示书写了你可以看到以下内容:
答案 2 :(得分:0)
我会创建一个指向函数的工厂......然后在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();
}
]);
您可以对配置工厂进行单元测试,并像对待任何其他工厂一样注入模拟。