Grunt可以看成JS领域的ANT,被广泛用于前端项目的构建工作,Grunt基于大名鼎鼎的node.js.有关Grunt的具体介绍以及安装,参见http://www.gruntjs.net/docs/getting-started/;
本文主要介绍如何在Grunt构建任务中增加mocha测试用例,并在Grunt中利用jsdom这个npm来模拟浏览器的运行环境。
Mocha是一款主流的基于node.js的js测试框架,提供TDD和BDD两种测试模式,有关Mocha的详细介绍,请参见http://cnodejs.org/topic/516526766d38277306c7d277;
下载地址 http://nodejs.org/download/ 安装完毕后将node的路径加入到系统环境变量Path中,例如D:\nodejs\
http://nodejs.org/dist/npm找到最新的版本。解压npm,将 npm挪node.exe到目录下,这样npm就可以调用到node了,参见
d:\nodejs 的目录 2014/03/06 16:50 <DIR> . 2014/03/06 16:50 <DIR> .. 2014/03/06 16:50 298 grunt 2014/03/06 16:50 159 grunt.cmd 2014/03/04 21:54 290 mocha 2014/03/04 21:54 151 mocha.cmd 2014/03/06 08:55 324 node-debug 2014/03/06 08:55 185 node-debug.cmd 2014/03/06 08:55 322 node-inspector 2014/03/06 08:55 183 node-inspector.cmd 2014/02/18 15:52 6,930,792 node.exe 2014/01/28 18:55 697 nodevars.bat 2014/01/28 18:55 6,584 node_etw_provider.man 2014/03/06 16:50 <DIR> node_modules 2014/01/28 18:55 4,974 node_perfctr_provider.man 2014/03/04 21:49 296 npm 2014/03/04 21:49 157 npm.cmd 2014/03/04 21:54 292 _mocha 2014/03/04 21:54 153 _mocha.cmd
执行如下命令即可实现安装,命令npm install -g grunt-cli。
命令:npm install grunt-mocha-test。
grunt-mocha-test,命令:npm install grunt-mocha-test
在安装jsdom前需要安装python,并将python路径加入到Path中,执行npm install jsdom即可
var jsdom = require('jsdom'); jsdom.env({ html: "<DIV/>", documentRoot: '<%= pkg.name%>/../../../', scripts: [], done:function(errors, window){ global.window = window; for (var p in window) { if (!global[p]) { global[p] = window[p]; } } window.localStorage = {}; window.localStorage.get = function(){ return this; } window.localStorage.getItem = function(name){ return this[name]; } window.localStorage.set = function(data){ this = data; } window.localStorage.setItem = function(name, value){ this[name] = value; } grunt.tasks(cli.tasks, cli.options, done); }});
var requirejs = require('requirejs'); var c_require = require; requirejs.config({ //Pass the top-level main.js/index.js require //function to requirejs so that node modules //are loaded relative to the top-level JS file. baseUrl: '../../src', nodeRequire: require }); require = function(path, callback) { if (arguments.length == 2) { return requirejs.call(global, path, callback); } else { return c_require.call(global, path); } }项目代码中不能使用web绝对路径,需要调整为相对路径,基准路径一般就是gurntfile所在路径,否则不能识别。
'use strict'; module.exports = function(grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), mochaTest: { test: { options: { ui: 'tdd', reporter: 'spec' }, src: ['<%= pkg.name%>/testcase/*.js'] } } }); grunt.loadNpmTasks('grunt-mocha-test'); grunt.registerTask('default', ['mochaTest']); };