我正在尝试用Mocha编写测试来运行Karma,它们有点工作,但是我不能使用done()方法来实现异步测试,这实际上使得这些工具对我来说毫无用处.我错过了什么?
karma.conf.js
module.exports = function(config) { config.set({ basePath: '../..',frameworks: ['mocha','requirejs','qunit'],client: { mocha: { ui: 'bdd' } },files: [ {pattern: 'libs/**/*.js',included: false},{pattern: 'src/**/*.js',{pattern: 'tests/mocha/mocha.js',{pattern: 'tests/should/should.js',{pattern: 'tests/**/*Spec.js','tests/karma/test-main.js' ],exclude: [ 'src/main.js' ],// test results reporter to use // possible values: 'dots','progress','junit','growl','coverage' reporters: ['progress','dots'],port: 9876,colors: true,// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG logLevel: config.LOG_WARN,autoWatch: true,// Start these browsers,currently available: // - Chrome // - ChromeCanary // - Firefox // - Opera (has to be installed with `npm install karma-opera-launcher`) // - Safari (only Mac; has to be installed with `npm install karma-safari-launcher`) // - PhantomJS // - IE (only Windows; has to be installed with `npm install karma-ie-launcher`) browsers: ['Chrome'],// If browser does not capture in given timeout [ms],kill it captureTimeout: 60000,// Continuous Integration mode // if true,it capture browsers,run tests and exit singleRun: false }); };
test-main.js(配置RequireJS)
var allTestFiles = []; var pathToModule = function(path) { return path.replace(/^\/base\//,'../').replace(/\.js$/,''); }; Object.keys(window.__karma__.files).forEach(function(file) { if (/Spec\.js$/.test(file)) { // Normalize paths to RequireJS module names. allTestFiles.push(pathToModule(file)); } }); require.config({ // Karma serves files under /base,which is the basePath from your config file baseUrl: '/base/src',paths: { 'should': '../tests/should/should','mocha': '../tests/mocha/mocha','pubsub': '../libs/pubsub/pubsub','jquery': '../libs/jquery/jquery-1.10.2','jquery-mobile': '//code.jquery.com/mobile/1.4.2/jquery.mobile-1.4.2.min' },// dynamically load all test files deps: allTestFiles,// we have to kickoff jasmine,as it is asynchronous callback: window.__karma__.start });
测试/ fooSpec.js
define(['music/note'],function(Note) { describe('nothing',function(done) { it('a silly test',function() { var note = new Note; note.should.not.eql(32); }); done(); }); ...
虽然这是一个人为的例子,但如果我删除done()调用它会成功.事实上,我得到:
Uncaught TypeError: undefined is not a function at /Library/WebServer/Documents/vg/tests/mocha/fooSpec.js:8
这是done()行.如何/为什么没有定义?我不知道在哪里配置Mocha(或使用什么选项).是否存在某种全局命名空间或元编程魔法导致RequireJS干扰Mocha?
我正在OS X 10.9.2上的Chrome 33中运行测试,如果完全相关的话.我已经花了很多时间在这上面并准备放弃自动化测试:( – 有类似的砖墙与QUnit / Karma / RequireJS,并且无法找到任何替代成功自动化测试.我感觉像一个白痴.
解决方法
在Mocha中,完成回调是针对它的,之前,之后,之后是每个.所以:
describe('nothing',function() { it('a silly test',function(done) { var note = new Note; note.should.not.eql(32); done(); }); });
这是doc.