这里要注意的时,上面的插件大部分都不需要单独安装,因为安装karma的时候已经安装了,这里只有karma-junit-reporter导出插件需要单独安装,想要了解更多的关于配置文件的信息可以,点击这里
  karma讲到这里,想了解更多关于它的信息可以,点击这里
  什么是jasmine
  Jasmine is a behavior-driven development framework for testing JavaScript code. It does not depend on any other JavaScript frameworks. It does not require a DOM. And it has a clean, obvious syntax so that you can easily write tests.
  上面是jasmine官方文档里对它的解释,下面用中文简单的翻译下
  jasmine是一个行为驱动开发的测试框架,不依赖任何js框架以及dom,是一个非常干净以及友好API的测试库.
  下面简单的以一个例子来说明它的用法
  定义一个测试文件命令为test.js
describe("A spec (with setup and tear-down)", function() {
var foo;
beforeEach(function() {
foo = 0;
foo += 1;
});
afterEach(function() {
foo = 0;
});
it("is just a function, so it can contain any code", function() {
expect(foo).toEqual(1);
});
it("can have more than one expectation", function() {
expect(foo).toEqual(1);
expect(true).toEqual(true);
});
});
  上面的例子来自于官网,这里只说下几个重要的API,更多的用法请,点击这里
  首先任何一个测试用例以describe函数来定义,它有两参数,第一个用来描述测试大体的中心内容,第二个参数是一个函数,里面写一些真实的测试代码
  it是用来定义单个具体测试任务,也有两个参数,第一个用来描述测试内容,第二个参数是一个函数,里面存放一些测试方法
  expect主要用来计算一个变量或者一个表达式的值,然后用来跟期望的值比较或者做一些其它的事件
  beforeEach与afterEach主要是用来在执行测试任务之前和之后做一些事情,上面的例子是在执行之前改变变量的值,然后在执行完成之后重置变量的值
  后要说的是,describe函数里的作用域跟普通JS一样都是可以在里面的子函数里访问的,像上面的it访问foo变量
  想要运行上面的测试例子可以通过karar来运行,命令例子如下
  karma start test/karma.conf.js
  下面我们重点的说说ng里的控制器,指令,服务模块的单元测试.
  NG的单元测试
  因为ng本身框架的原因,模块都是通过di来加载以及实例化的,所以为了方便配合jasmine来编写测试脚本,所以官方提供了angular-mock.js的一个测试工具类来提供模块定义,加载,注入等.
  下面说说ng-mock里的一些常用方法
  angular.mock.module 此方法同样在window命名空间下,非常方便调用
  module是用来配置inject方法注入的模块信息,参数可以是字符串,函数,对象,可以像下面这样使用
  beforeEach(module('myApp.filters'));
  beforeEach(module(function($provide) {
  $provide.value('version', 'TEST_VER');
  }));
  它一般用在beforeEach方法里,因为这个可以确保在执行测试任务的时候,inject方法可以获取到模块配置
  angular.mock.inject 此方法同样在window命名空间下,非常方便调用
  inject是用来注入上面配置好的ng模块,方面在it的测试函数里调用,常见的调用例子如下
angular.module('myApplicationModule', [])
.value('mode', 'app')
.value('version', 'v1.0.1');
describe('MyApp', function() {
// You need to load modules that you want to test,
// it loads only the "ng" module by default.
beforeEach(module('myApplicationModule'));
// inject() is used to inject arguments of all given functions
it('should provide a version', inject(function(mode, version) {
expect(version).toEqual('v1.0.1');
expect(mode).toEqual('app');
}));
// The inject and module method can also be used inside of the it or beforeEach
it('should override a version and test the new version is injected', function() {
// module() takes functions or strings (module aliases)
module(function($provide) {
$provide.value('version', 'overridden'); // override version here
});
inject(function(version) {
expect(version).toEqual('overridden');
});
});
});
  上面是官方提供的一些inject例子,代码很好看懂,其实inject里面是利用angular.inject方法创建的一个内置的依赖注入实例,然后里面的模块注入跟普通ng模块里的依赖处理是一样的
  简单的介绍完ng-mock之后,下面我们分别以控制器,指令,过滤器来编写一个简单的单元测试.
  ng里控制器的单元测试
  定义一个简单的控制器
var myApp = angular.module('myApp',[]);
myApp.controller('MyController', function($scope) {
$scope.spices = [{"name":"pasilla", "spiciness":"mild"},
{"name":"jalapeno", "spiciness":"hot hot hot!"},
{"name":"habanero", "spiciness":"LAVA HOT!!"}];
$scope.spice = "hello feenan!";
});
然后我们编写一个测试脚本
describe('myController function', function() {
describe('myController', function() {
var $scope;
beforeEach(module('myApp'));
beforeEach(inject(function($rootScope, $controller) {
$scope = $rootScope.$new();
$controller('MyController', {$scope: $scope});
}));
it('should create "spices" model with 3 spices', function() {
expect($scope.spices.length).toBe(3);
});
it('should set the default value of spice', function() {
expect($scope.spice).toBe('hello feenan!');
});
});
});