Write Typescript UT with Karma & Jasmine

What is Karma


Karma是Testacular的新名字,在2012年google开源了Testacular,2013年Testacular改名为Karma。Karma是一个让人感到非常神秘的名字,表示佛教中的缘分,因果报应,比Cassandra这种名字更让人猜不透!

Karma是一个基于Node.js的JavaScript测试执行过程管理工具(Test Runner)。该工具可用于测试所有主流Web浏览器,也可集成到CI(Continuous integration)工具,也可和其他代码编辑器一起使用。这个测试工具的一个强大特性就是,它可以监控(Watch)文件的变化,然后自行执行,通过console.log显示测试结果。

Install Karma


Using below commands to install Karma with npm

npm install -g karma
npm install -g karma-cli
npm install karma-jasmine karma-chrome-launcher [optional]

Karma Config


karma.conf.js

  • basePath
  • frameworks
  • files
  • excludes
  • port
  • browsers

Example:

// Karma configuration
// Generated on Fri Aug 14 2015 14:42:50 GMT-0400 (Eastern Daylight Time)

module.exports = function (config) {
    config.set({
        // base path that will be used to resolve all patterns (eg. files, exclude)
        basePath: '',

        // frameworks to use
        // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
        frameworks: ['jasmine', 'requirejs'],

        // list of files / patterns to load in the browser
        files: [
          'test-main.js',
          { pattern: 'Web/src/**/*.js', included: false },
          { pattern: 'Web/src/**/*.html', included: false },
          { pattern: 'Web/tests/**/*.test.js', included: false },
        ],

        // list of files to exclude
        exclude: [
            'Web/src/main.js',
            'Web/src/**/*.test.js'
        ],

        // preprocess matching files before serving them to the browser
        // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
        preprocessors: {
        },

        // test results reporter to use
        // possible values: 'dots', 'progress'
        // available reporters: https://npmjs.org/browse/keyword/karma-reporter
        reporters: ['progress'],

        // web server port
        port: 9876,

        // enable / disable colors in the output (reporters and logs)
        colors: true,

        // level of logging
        // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
        logLevel: config.LOG_INFO,


        // enable / disable watching file and executing tests whenever any file changes
        autoWatch: true,

        // start these browsers
        // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
        browsers: ['Chrome'],

        // Continuous Integration mode
        // if true, Karma captures browsers, runs the tests and exits
        singleRun: false
    })
}

test-main.js


test-main.js is the entrance of the test run.

Example:

var allTestFiles = [];
var TEST_REGEXP = /(spec|test)\.js$/i;

// Get a list of all the test files to include
Object.keys(window.__karma__.files).forEach(function (file) {
    if (TEST_REGEXP.test(file)) {
        // Normalize paths to RequireJS module names.
        // If you require sub-dependencies of test files to be loaded as-is (requiring file extension)
        // then do not normalize the paths
        var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, '');
        allTestFiles.push(normalizedTestModule);
    }
});

require.config({
    // Karma serves files under /base, which is the basePath from your config file
    baseUrl: '/base',

    paths: {
        'angular': 'http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.4/angular.min',
        'angularMocks': 'http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.4/angular-mocks',
        text: 'http://cdnjs.cloudflare.com/ajax/libs/require-text/2.0.12/text.min',
        'lodash': 'http://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min',
    },

    shim: {
        'angular': { exports: 'angular' },
        'angularMocks': { deps: ['angular'] }
    },

    // dynamically load all test files
    deps: allTestFiles,

    // we have to kickoff jasmine, as it is asynchronous
    callback: window.__karma__.start
});

Write Typescript UT


Step
1. Create module

var mockedModule = angular.module("mock.module", []);

Create module with $provide

var mockedModule = module('mock.module', ($provide) => {
        //register mocked services/values to module runtime
        $provide.value('$translate', mockedTranslate);
    });

2. Register filter/controller to module

mockedModule.filter(targetFilter.name, targetFilter.filterClass);

3. Apply module

angular.mock.module("mock.module");

4. Inject the filter/scope/controller or other resources

var fieldFilter
inject(($filter) => {
    fieldFilter = $filter(targetFilter.name);
});

or use new keyword to create an instance, this can skip the step 1,2 and 3

fieldFilter = new targetModule.filterClass(scope, mockedDataService, mockedBusinessService);

5. Write Cases

it("Should be able to convert number to eggs", () => {
    expect(fieldFilter(1)).toEqual("1 egg");
    expect(fieldFilter(2)).toEqual("2 eggs");
});

Run UT


At the root folder of the source code, for example,

d:/src/

Run the below command:

karma start

You will see the test result:
result

Debug


Click the “Debug” button on the page to enter debug mode

debug

Tips


  • It will run UT automatically when it detected file changes
  • Terminates it press Crtl + C

References


Karma Introduction
Karma和Jasmine自动化单元测试

博主开通了微信公众号,欢迎关注啦

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.