AMD module 单元测试

若有排版结果杂沓,请移步https://www.zybuluo.com/bornkiller/note/24759

媒介

  • karma合营requirejs举行单元测试,存在官方版本http://karma-runner.github.io/0.8/plus/RequireJS.html,版本虽然陈腐,然则功用完成没有题目。

  • 单元测试中设置文件test-main.js与现实main.js存在差别,所以单元测试保证模块的可靠性,详细临盆环境下注重模块可一般加载就好。。

  • 下面代码仅为部份需特别注重代码,别的字段省略。

package.json

{
  "dependencies": {
  },
  "devDependencies": {
    "karma": "^0.12.19",
    "karma-chrome-launcher": "^0.1.4",
    "karma-cli": "^0.0.4",
    "karma-jasmine": "^0.1.5",
    "karma-requirejs": "^0.2.2",
    "requirejs": "^2.1.14"
  },
}

为单元测试而装置的node模块。

karma.config

推荐在现实运用时,用NPM在项目中再装置一次,更轻易明白一些。

// Karma configuration
// Generated on Tue Jul 29 2014 10:24:37 GMT+0800 (中国标准时间)

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: [
      {pattern: 'lib/**/*.js', included: false},
      {pattern: 'service/**/*.js', included: false},
      {pattern: 'test/**/*spec.js', included: false},
      'test-main.js'
    ],

  });
};

  • basePath运用默认值即可。
  • framework如上填写后,页面会自动引入断言库和加载库,不在须要手动引入。
<script type="text/javascript" src="/base/node_modules/requirejs/require.js"></script>
<script type="text/javascript" src="/base/node_modules/karma-requirejs/lib/adapter.js"></script>
<script type="text/javascript" src="/base/node_modules/karma-jasmine/lib/jasmine.js"></script>
<script type="text/javascript" src="/base/node_modules/karma-jasmine/lib/adapter.js"></script>
  • 须要注重的是files字段,included设置为false,示意不会直接经由过程<script>标签直接显式引入剧本,假如直接引入,会致使define无定义,致使报错。served字段默以为true,示意会供应对应静态文件,能够异步加载。

test-main.js

karma init敕令执行时,是不是天生requirejs 模板文件,务必需要点是,天生模板以下:

  • 第一部份——测试文件模块化
var allTestFiles = [];
var TEST_REGEXP = /(spec|test)\.js$/i;

var pathToModule = function(path) {
  return path.replace(/^\/base\//, '').replace(/\.js$/, '');
};

Object.keys(window.__karma__.files).forEach(function(file) {
  if (TEST_REGEXP.test(file)) {
    // Normalize paths to RequireJS module names.
    allTestFiles.push(pathToModule(file));
  }
});

功用实在很简单,将spec.js或许test.js末端的文件去掉后缀,现实上为模块化测试文件,后续运用requirejs加载。

  • 第二部份——requirejs设置
require.config({
  // Karma serves files under /base, which is the basePath from your config file
  baseUrl: '/base',

  paths : {
      'jquery' : 'service/jquery',
      'movie' : 'service/movie'
  },

  // dynamically load all test files
  deps: allTestFiles,

  shim : {
    'jquery' : {
        deps : [],
        exports : 'jQuery'
    }
  },

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

须要注重的是,baseUrl必需/base开首,示意karma webserver根目录。注重deps字段,此处为测试文件异步加载,因为测试文件跟模块文件在两个文件夹下,所以,发起经由过程path设置模块,防止文件构造构造杂沓。

service.spec.js

define(['jquery','movie'], function($,movie) {

    describe('just checking', function() {

        it('works for app', function() {
            expect($).toBeDefined();
        });

        it('works for moive type', function () {
            expect(movie.type).toEqual('comedy')
        });

        it('works for movie name', function () {
            expect(movie.name).toEqual('500 days with summer');
        });

    });

});

包装上,跟通例测试文件有差别,模块必需由define引入内部, 与describe it没有显著的位置分列请求。

题目交换

总的来说,觉得挺烦琐的,从karma设置文件,requirejs设置文件,测试文件都须要举行特别处置惩罚。能够陈说上有题目,若有疑问
QQ: 491229492
Email: 491229492@qq.com,说明交换即可。

    原文作者:怀疑真爱的流浪者jason
    原文地址: https://segmentfault.com/a/1190000000621719
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞