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. Linq To Object

    //SelectMany List<List<int>> Numbers = new List<List<int>>() { new List<i ...

  2. linux-3重置root密码

    1.首先确认是redhat7 [root@localhost /]# cat /etc/redhat-release 详细步骤: 第1步:开机后在内核上敲击"e". 第2步:在li ...

  3. 从0开始学Swift笔记整理(五)

    这是跟在上一篇博文后续内容: --Core Foundation框架 Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.虽然在Sw ...

  4. PHP-Beast V0.6 发布 (PHP源码加密模块)

    本版本主要修改了一些bug和增加了一些配置项: 1. 设置缓存大小可以使用单位, 例如: beast.cache_size = 10m; 2. 可以在配置文件中禁止beast模块, 例如: beast ...

  5. [JS2] JS是弱类型

    <html> <head> <title>JavaScript 是弱类型的</title> <Script Language="Java ...

  6. Jenkins与.NET项目

    转自: https://blog.dangl.me/categories Continuous Integration RSS Date Post 2016-10-20 Set Up Private ...

  7. 基于javascript实现图片懒加载(亲测有效)

    这篇文章主要介绍了javascript实现图片懒加载的方法及思路,有时我们需要用懒加载,也就是延迟加载图片的方式,来提高网站的亲和力,需要的朋友可以参考下! 一.定义 图片延迟加载也称为懒加载,延迟加 ...

  8. Atitit. 构造ast 语法树的总结attilax v2 q0f

    Atitit. 构造ast 语法树的总结attilax v2 q0f 1. Ast结构树形1 2. ast view (自是个160k的jar )2 2.1. 多条语句ast结构2 2.2. 变量定义 ...

  9. [转]Oracle因安装时未设定字符集导致中文乱码的解决方案

    在CentOS 6.4上安装Oracle 11g没有设定字符集,采用的是操作系统默认字符集:WE8MSWIN1252,将字符集修改为:AL32UTF8. SQL> select userenv( ...

  10. python判断文件和目录是否存在

    #Python的os.path模块提供了 isdir() 和 isfile()函数,请导入该模块,并调用函数判断指定的目录和文件是否存在. import os print os.path.isdir( ...