我有一个AngularJS前端加载了RequireJS和r.js优化生产,所以它在一个文件中很好.这有效!
什么不起作用是执行单元测试.到目前为止,这并不奇怪,只是从教程中复制了一个启动器.
测试/用户/ user.test.js:
define(['angular','angular-mocks','app'],function(angular,app) { describe('Unit: UserController',function() { beforeEach(module('user.app')); it('should do something',function() { console.log('did it'); }); }); });
然后我有一个karma.conf.js:
module.exports = function(config) { config.set({ logLevel: config.LOG_DEBUG,basePath: './',files: [ // r.js'd app files {pattern: 'dist/app.js',included: false},// the tests {pattern: 'tests/**/*.test.js',included: true},],excluded: ['tests/main.test.js'] frameworks: ['jasmine','requirejs'],browsers: ['PhantomJS'],plugins: [ 'karma-jasmine','karma-junit-reporter','karma-phantomjs-launcher','karma-requirejs' ],}); };
一个main.test.js:
var allTestFiles = []; var TEST_REGEXP = /(spec|test)\.js$/i; var pathToModule = function(path) { var returnValue = path.replace(/^\/base\//,'').replace(/\.js$/,''); return returnValue; }; Object.keys(window.__karma__.files).forEach(function(file) { if (TEST_REGEXP.test(file)) { // Normalize paths to RequireJS module names. allTestFiles.push(pathToModule(file)); } }); require.config({ baseUrl: '/base',paths: { 'angular-mocks': 'node_modules/angular-mocks/angular-mocks','app': 'dist/app',},deps: allTestFiles,callback: function() { console.log('load complete'); window.__karma__.start(); },});
最后是一个吞咽任务:
var gulp = require('gulp'); var karma = require('karma').server; gulp.task('unit-test',function(done) { karma.start({ configFile: __dirname + '/karma.conf.js',singleRun: true },function() { done(); }); }
但我很难得到这个错误:在tests / user / user.test.js中不匹配的匿名define(),我看不出有什么问题.这是输出:
http://pastebin.com/evJPj9B3
如果我将单元测试模块命名为
define('namedtestorso',['angular',app) { ...
…我不再收到错误,但测试没有执行.因为我可以回想起所有的例子都使用它作为匿名定义我假设命名在这里不正确.但在这种情况下,执行日志输出显示main.test.js的配置回调执行两次. (这是暗示某事吗?)
解决方法
我认为我现在理解了业力如何运作(请告诉我,如果我错了),所以我发现了我必须做的事情.
似乎是将文件放入karma.conf.js,以便它们可用于加载main.test.js.否则,它们不在“上下文”中,无法访问.但是当放入那里时,请确保将包含的标志设置为false.
对karma.conf.js的更改:
files: [ ... // Also included these dependencies. All the others are minified in the // app.js but if you don't do that,also include all project deps like // AngularJS etc. { pattern: 'node_modules/jasmine-core/lib/jasmine-core/boot.js',included: false },{ pattern: 'node_modules/angular-mocks/angular-mocks.js',// Then I had an error in my pattern ('tests/**/*.test.js') // Only the `main.test.js` is supposed to be included! { pattern: 'tests/user/user.test.js',included: false } { pattern: 'tests/main.test.js',included: true } ...
如果我是正确的,Karma会创建一个HTML文件,并且包含的文件:true将通过脚本标记加载.这就是为什么如果使用RequireJS,将include设置为false很重要,因为如果你这样做,你将得到Error:Mismatched anonymous define().所以这对我来说很有意义.
解决了这个问题后,其他一些模块找不到.因为我使用了RequireJS优化器,所以我必须将所有模块“映射”到主app.js文件,这样当测试JS文件需要某个模块时,RequireJS可以确保它被(或得到)加载.
所以我最终改变了main.test.js中的路径部分:
paths: { // Added these for example 'angular': '../dist/app','angular-ui-router': '../dist/app',// (and also my project modules) ...
对,这看起来有点黑客.在解决此问题的同时,我还将我的工作流程更改为在dev文件上运行单元测试,并依赖其他工具正常工作(如果没有问题可以通过e2e测试捕获).
希望在我的情况下帮助别人!