Install Karam:

npm install -g karma
npm install -g karma-cli

Init Karam:

karma init

First test:

1. Add test file to the karma.conf.js:

    // list of files / patterns to load in the browser
files: [
'test/hello.js'
],

2. Add test file:

describe('First Unit testing with Karma', function() {
it('sholud work', function() {
expect(true).toBe(false);
})
})

Of course, it will failed.

Then we make it pass:

describe('First Unit testing with Karma', function() {
it('sholud work', function() {
expect(true).toBe(true);
})
})

Testing with AngularJS


Install angular-mocks:

npm install angular-mocks

Include the angular.js and angular-mocks.js file before the test file:

    // list of files / patterns to load in the browser
files: [
'test/hello.js',
'bower_components/angular/angular.js',
'node_modules/angular-mocks/angular-mocks.js',
'test/anuglarjs.js'
],

Write the test file:

describe('Testing with AngularJS', function() {
//Want $scope and element can be used globally
var $scope,
element; //We need to inject $compile, $rootScope
beforeEach(inject(function($compile, $rootScope) {
$scope = $rootScope;
//create an 'angular element'
element = angular.element("<div>{{2+2}}</div>");
//then compile it to real angular element
//also it requires link function and scope
element = $compile(element)($rootScope);
})); it('should equals to 4', function() {
//make sure to $digest() it to get the change
$scope.$digest();
expect(element.html()).toBe("5"); // change to "4" to make it pass
})
})

Now, "4" is not "5", then it will failed, switch to "4" to make it pass.

Testing Directive:


    .directive('aGreatEye', function () {
return {
restrict: 'E',
replace: true, //Important to add replace: true, otherwise, it would be <h1 class="ng-binding">...</h1>"
template: '<h1>lidless, wreathed in flame, {{1 + 1}} times</h1>'
};
});
describe('Testing directive', function() {
var $scope,
$compile,
element; beforeEach(module('app')); beforeEach(inject(function(_$compile_, _$rootScope_) {
$compile = _$compile_;
$scope = _$rootScope_;
})); it("Replaces the element with the appropriate content", function() {
element = $compile('<a-great-eye></a-great-eye>')($scope);
$scope.$digest();
expect(element.html()).toBe('lidless, wreathed in flame, 2 times');
})
});

Underscore notation: The use of the underscore notation (e.g.: _$rootScope_) is a convention wide spread in AngularJS community to keep the variable names clean in your tests. That's why the $injector strips out the leading and the trailing underscores when matching the parameters. The underscore rule applies only if the name starts and ends with exactly one underscore, otherwise no replacing happens.

Testing Directives With External Templates:


1. Install 'karma-ng-html2js-preprocessor': https://github.com/karma-runner/karma-ng-html2js-preprocessor

npm install karma-ng-html2js-preprocessor --save-dev

2. Add config to karma.config.js:

    // preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
'*.html': ['ng-html2js']
}, ngHtml2JsPreprocessor: {
// strip this from the file path
stripPrefix: '/' //because currently all the html files are located in / root
},

3. Add html into beforeEach:

describe('Testing directive', function() {
var $scope,
$compile,
element; beforeEach(module('app')); // Add html file here
beforeEach(module('directivetest.html')); beforeEach(inject(function(_$compile_, _$rootScope_) {
$compile = _$compile_;
$scope = _$rootScope_;
})); it("Replaces the element with the appropriate content", function() {
element = $compile('<a-great-eye></a-great-eye>')($scope);
$scope.$digest();
expect(element.html()).toBe('lidless, wreathed in flame, 2 times');
})
});
    .directive('aGreatEye', function () {
return {
restrict: 'E',
replace: true,
templateUrl: 'directivetest.html'
};
}); /*directivetest.html*/
<h1>lidless, wreathed in flame, {{1 + 1}} times</h1>

Testing Directive Scope:


1. Check after a click event, scope value changed:

    .directive('aGreatEye', function () {

        return {
restrict: 'EA',
replace: true,
templateUrl: 'directivetest.html',
link: function(scope, element) {
scope.isClicked = false;
element.bind('click', function() {
scope.isClicked = true;
})
}
};
});
    it("isClicked is true after click", function() {
element = $compile('<a-great-eye></a-great-eye>')($scope);
$scope.$digest();
element.triggerHandler('click');
expect($scope.isClicked).toBe(true);
});

2. Isolated scope testing:

    .directive('aGreatEye', function () {

        return {
restrict: 'EA',
replace: true,
scope: {},
templateUrl: 'directivetest.html',
link: function(scope, element) {
scope.isClicked = false;
element.bind('click', function() {
scope.isClicked = true;
})
}
};
});
    it("isolated scope testing", function() {
element.triggerHandler('click');
expect(element.isolateScope().isClicked).toBe(true);
});

You can no long use "element.scope()" or "$scope", you should use "element.isolateScope()".

Testing Directive Scope Binding:


Tow ways binding:

    .directive('aGreatEye', function () {

        return {
restrict: 'EA',
replace: true,
scope: {
flavor: "=" //Accpet an object
},
templateUrl: 'directivetest.html',
link: function(scope, element) { element.bind('click', function() {
scope.isClicked = true; scope.flavor.message += " World!";
})
}
};
});
    beforeEach(inject(function(_$compile_, _$rootScope_) {
$compile = _$compile_;
$scope = _$rootScope_;
$scope.goPro = {message: "Hello"};
element = $compile('<div a-great-eye flavor="goPro"></div>')($scope);
$scope.$digest();
})); it("after click the scope.data should be Hello World!", function() {
element.triggerHandler('click');
expect($scope.goPro.message).toBe('Hello World!');
expect(element.isolateScope().flavor.message).toBe("Hello World!");
});

Testing Speed:


Using ddescriber plugin to speed up unit testing.

Install the plugin "ddscriber for jasmine". Ctrl+Shift+D, to open the dailog. In the dialog you can choose which test to be included or not.

The code is modfied as:

/**
* Created by Answer1215 on 1/16/2015.
*/
ddescribe('Testing directive', function() {
var $scope,
$compile,
element; beforeEach(module('app')); beforeEach(module('directivetest.html')); beforeEach(inject(function(_$compile_, _$rootScope_) {
$compile = _$compile_;
$scope = _$rootScope_;
$scope.goPro = {message: "Hello"};
element = $compile('<div a-great-eye flavor="goPro"></div>')($scope);
$scope.$digest();
})); iit("Replaces the element with the appropriate content", function() {
expect(element.html()).toContain("lidless, wreathed in flame, 2 times");
}); //it("isClicked is true after click", function() {
// element.triggerHandler('click');
// expect($scope.isClicked).toBe(true);
//}); iit("isolated scope testing", function() {
element.triggerHandler('click');
//expect(element.isolateScope().isClicked).toBe(true);
}); xit("after click the scope.data should be Hello World!", function() {
element.triggerHandler('click');
expect($scope.goPro.message).toBe('Hello World!');
//expect(element.isolateScope().flavor.message).toBe("Hello World!");
});
}); xdescribe("error driective testing", function() { var $scope, $compile, element; beforeEach(module('app')); beforeEach(module('error.html')); beforeEach(inject(function(_$compile_, _$rootScope_) {
$scope = _$rootScope_;
$compile = _$compile_; element = $compile('<error></error>')($scope);
$scope.$digest();
})); iit("Should contains alert-danger class", function() {
expect(element.find('div').hasClass('alert-danger')).toBe(true);
});
});

ddscribe / iit  -- include

xdscribe / xit -- exclude

Testing Service:


Testing service, you need to inject the service into beforeEach.

ddescribe('testing service', function() {
var SmithService; beforeEach(module('app'));
beforeEach(inject(function(_SmithService_) {
SmithService = _SmithService_;
})); iit('should append Smith after each name', function() {
expect(SmithService.getName("John")).toBe("John Smith");
})
});

This testing case is test whenever use a service to get a name we will append " Smith" to the end.

  .service('SmithService', function() {
var SmithService = {};
SmithService.getName = function(name) {
return name + " Smith";
} return SmithService;
});

Testing Controller:


Testing controller, you need to inject the $controller into beforeEach. And get ctrl instence by using:

appCtrl = $controller("AppCtrl")
ddescribe('Test Controller', function() {
var ctrl;
beforeEach(module('app'));
beforeEach(inject(function(_$controller_) {
ctrl = _$controller_("TestCtrl");
}));
iit('Test Controller', function() {
expect(ctrl.message).toBe("Hello");
});
});
    .controller('TestCtrl', function() {
var vm = this; vm.message = "Hello";
});

[Unit Testing] AngularJS Unit Testing - Karma的更多相关文章

  1. Unit Testing, Integration Testing and Functional Testing

    转载自:https://codeutopia.net/blog/2015/04/11/what-are-unit-testing-integration-testing-and-functional- ...

  2. Difference Between Performance Testing, Load Testing and Stress Testing

    http://www.softwaretestinghelp.com/what-is-performance-testing-load-testing-stress-testing/ Differen ...

  3. AngularJS测试框架 karma备忘

    AngularJS测试框架karma安装 安装karma $ --save-dev 安装karma组件 $ npm install karma-jasmine karma-chrome-launche ...

  4. Go testing 库 testing.T 和 testing.B 简介

    testing.T 判定失败接口 Fail 失败继续 FailNow 失败终止 打印信息接口 Log 数据流 (cout 类似) Logf format (printf 类似) SkipNow 跳过当 ...

  5. [Angular + Unit] AngularJS Unit testing using Karma

    http://social.technet.microsoft.com/wiki/contents/articles/32300.angularjs-unit-testing-using-karma- ...

  6. [AngularJS Unit tesint] Testing keyboard event

    HTML: <div ng-focus="vm.onFocus(month)", aria-focus="{{vm.focus == month}}", ...

  7. [AngularJS + Unit Testing] Testing Directive's controller with bindToController, controllerAs and isolate scope

    <div> <h2>{{vm.userInfo.number}} - {{vm.userInfo.name}}</h2> </div> 'use str ...

  8. [AngularJS + Unit Testing] Testing a component with requiring ngModel

    The component test: describe('The component test', () => { let component, $componentController, $ ...

  9. [Unit Testing] Fundamentals of Testing in Javascript

    In this lesson, we’ll get the most fundamental understanding of what an automated test is in JavaScr ...

随机推荐

  1. Zabbix3.0 自动邮件报障

    Zabbix3.0以后,自带的邮件报警支持SSL验证了, 但是仍然没有发送复数个邮箱以及CC,BCC的功能, 因此,我们还是得用别的方法来实现邮件报障. 实现方法有很多种,我用的是PHPmailer. ...

  2. RabbitMQ 连接断开处理-自动恢复

    Rabbitmq 官方给的NET consumer示例代码如下,但使用过程,会遇到connection断开的问题,一旦断开,这个代码就会报错,如果你的消费者端是这样的代码的话,就会导致消费者挂掉. u ...

  3. Dynamic CRM 2013学习笔记(三十三)自定义审批流4 - 规则节点 -有分支的流程处理

    上次介绍过节点的基本配置<Dynamic CRM 2013学习笔记(三十二)自定义审批流3 - 节点及实体配置>,这次介绍下规则节点,因为有时流程里会有一些分支.合并,这时就要用到规则节点 ...

  4. 为什么在Mac中无法用k web运行ASP.NET 5程序

    k web对应的命令如下: "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebLi ...

  5. [ACM_暴力][ACM_几何] ZOJ 1426 Counting Rectangles (水平竖直线段组成的矩形个数,暴力)

    Description We are given a figure consisting of only horizontal and vertical line segments. Our goal ...

  6. Linux下jvm、tomcat、mysql、log4j优化配置笔记

    小菜一直对操作系统心存畏惧,以前也很少接触,这次创业购买了Linux云主机,由于木有人帮忙,只能自己动手优化服务器了.... 小菜的云主机配置大致为:centeos6(32位),4核心cpu,4G内存 ...

  7. 易出错的C语言题目之二:指针

    一.写出输出结果 #include<stdio.h> int main(){ ]; a[] = ; a[] = ; a[] = ; int *p,*q; p = a; q = &a ...

  8. mysql 5.6.17 x64 安装

    下载地址 百度网盘地址:http://pan.baidu.com/share/link?shareid=1895747668&uk=3257050114&fid=234538452 官 ...

  9. paip.java win程序迁移linux的最佳实践

    paip.java win程序迁移linux的最佳实践 1.class load路径的问题... windows哈第一的从calsses目录加载,,而linux优先从jar加载.. 特别的是修理了ja ...

  10. paip.花生壳 服务启动失败 以及不能安装服务,权限失败的解决

    paip.花生壳 服务启动失败 以及不能安装服务,权限失败的解决 系统win7 NewPhDDNS_1.0.0.30166.exe  作者Attilax  艾龙,  EMAIL:1466519819@ ...