Ich bin jetzt für eine Weile fest stecken, versuchen, Einheitstest einrichten und runnnning."Fehler: Mismatched anonymous define()" mit Karma + RequireJS + Jasmine
Ich habe ein AngularJS-Frontend geladen mit RequireJS und r.js für die Produktion optimiert, so ist es alles schön in einer einzigen Datei. Das funktioniert!
Was nicht funktioniert, ist die Durchführung der Komponententests. Das ist bisher nichts Besonderes, nur einen Starter aus einem Tutorial kopiert.
tests/user/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');
});
});
});
Dann habe ich ein 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'
],
});
};
A 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();
},
});
Und schließlich ein gulp
Aufgabe:
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(); });
}
Hier und da habe ich einige Log-Ausgaben hinzugefügt und es zeigt, dass die Dateien geladen sind.
Aber ich bin stecken in Error: Mismatched anonymous define()
in der tests/user/user.test.js
und ich sehe nicht, was falsch ist. Hier ist der Ausgang: http://pastebin.com/evJPj9B3
Wenn ich das Gerät Testmodul wie
define('namedtestorso', ['angular', 'angular-mocks', 'app'], function(angular, app) {
...
nennen ... Ich erhalte keinen Fehler mehr, sondern die Tests werden nicht ausgeführt. Da alle Beispiele, an die ich mich erinnern kann, es als anonyme Definition verwenden, nehme ich an, dass die Benennung hier nicht korrekt ist. In diesem Fall wird jedoch die Protokollausgabe ausgeführt, die zeigt, dass der Konfigurationsrückruf von main.test.js
zweimal ausgeführt wird. (Ist das ein Hinweis für etwas?)
Wäre toll, wenn jemand eine Idee hat, wie man es repariert/es zum Laufen bringt oder sogar weiter geht, um herauszufinden, was falsch ist. Danke im Voraus!