首页 测试 体会 查看内容

基于Karma和Jasmine的AngularJS测试

2014-4-25 15:53| 发布者: peter_zhang| 查看: 1512| 评论: 0

摘要:   AngularJS是继jQuery之后发生在JavaScript上最好的东西。这也是JavaScript开发一直以来想要的方式。Angular主要的优点之一就是它的依赖注入(Dependency Injection),它非常利于代码的单元测试。但有点小怪异的是 ...
'use strict';var app = angular.module('Application', ['ngResource']);app.factory('UserFactory', function($resource){return $resource('Users/users.json')});app.controller('MainCtrl', function($scope, UserFactory) {$scope.text = 'Hello World!';$scope.users = UserFactory.get();});  我们可以在 home.test.js 文件中创建我们的测试用例。我们从简单的那个测试开始:$scope.text 应该等于 ‘Hello World!’。 为了完成这个测试,我们需要模拟我们的 Application 模块以及 $scope 变量。我们会在Jasmine的 beforeEach 方法中做这个工作,这样的话我们在每个测试用例开始时可以有一个全新的(干净的)controler和scope对象。'use strict';describe('MainCtrl', function(){var scope;//我们会在测试中使用这个scope//模拟我们的Application模块并注入我们自己的依赖beforeEach(angular.mock.module('Application'));//模拟Controller,并且包含 $rootScope 和 $controllerbeforeEach(angular.mock.inject(function($rootScope, $controller){//创建一个空的 scopescope = $rootScope.$new();//声明 Controller并且注入已创建的空的 scope$controller('MainCtrl', {$scope: scope});});// 测试从这里开始});  从代码中你可以看到我们注入了我们自己的 scope,因此我们可以在它的外部验证它的信息。同时,别忘了模拟模块本身(第7行代码)!我们现在已经为测试做好了准备:// 测试从这里开始it('should have variable text = "Hello World!"', function(){expect(scope.text).toBe('Hello World!);});  如果你运行这个测试,它可以在任何指向Karma的浏览器中执行,并且测试通过。  发送$resource请求  现在我们已经准备好测试 $resource 请求。要完成这个请求,我们需要使用到 $httpBackend, 它一个模拟版本的Angular $http。我们会创建另一个叫做 $httpBackend 的变量,在第二个 beforEach块中,注入 _$httpBackend_ 并将新创建的变量指向 _$httpBackend_。接下来我们会告诉 $httpBackend 如何对请求做出响应。$httpBackend = _$httpBackend_;$httpBackend.when('GET', 'Users/users.json').respond([{id: 1, name: 'Bob'}, {id:2, name: 'Jane'}]);  我们的测试: it('should fetch list of users', function(){$httpBackend.flush();expect(scope.users.length).toBe(2);expect(scope.users[0].name).toBe('Bob');});  都放到一起'use strict';describe('MainCtrl', function(){var scope, $httpBackend;//we'll use these in our tests//mock Application to allow us to inject our own dependenciesbeforeEach(angular.mock.module('Application'));//mock the controller for the same reason and include $rootScope and $controllerbeforeEach(angular.mock.inject(function($rootScope, $controller, _$httpBackend_){$httpBackend = _$httpBackend_;$httpBackend.when('GET', 'Users/users.json').respond([{id: 1, name: 'Bob'},{id:2, name: 'Jane'}]);//create an empty scopescope = $rootScope.$new();//declare the controller and inject our empty scope$controller('MainCtrl', {$scope: scope});});// tests start hereit('should have variable text = "Hello World!"', function(){expect(scope.text).toBe('Hello World!');});it('should fetch list of users', function(){$httpBackend.flush();expect(scope.users.length).toBe(2);expect(scope.users[0].name).toBe('Bob');});});  技巧  ·Karma会运行所有文件中的所有测试用例,如果你只想运行所有测试的一个子集,修改 describe 或 it 为 ddescribe 或 iit 来运行个别的一些测试。如果有些测试你不想运行他们,那么修改 describe 或 it 为 xdescribe 或 xit 来忽略这些代码。  ·我建议通篇阅读一下 Jasmine文档 来获取更多的可用方法。  ·你也可以在html文件的页面上运行你的测试。举例的代码如下:
  基本的测试  我们假设你已经有一个文件需要测试。我们要使用到的 home.js 文件如下:
12

鲜花

握手

雷人

路过

鸡蛋

扫一扫关注最新动态

毒镜头:老镜头、摄影器材资料库、老镜头样片、摄影
爱评测 aipingce.com  
返回顶部