Essayer de faire fonctionner le karma avec requirejs. Je ne comprends pas pourquoi toutes ces erreurs se produisent lors de l'exécution de Karma:
ERROR: 'There is no timestamp for /base/test/mainSpec.js?bust=1387739317116!'
ERROR: 'There is no timestamp for /base/app/main.js?bust=1387739317116!'
ERROR: 'There is no timestamp for /base/bower_components/jquery/jquery.js?bust=1387739317116!'
Lorsque je vais à l'onglet Réseau dans Inspector, tous les fichiers sont là sans 404.
Je suis un peu confus car le karma semble chercher un répertoire de base, mais il n'y a pas de répertoire de base dans mon projet. Selon le karma docs:
Karma sert des fichiers dans le répertoire/base. Donc, sur le serveur les demandes de fichiers seront traitées sous
http://localhost:9876/base/*
. La configuration Require.js pour baseUrl donne un contexte de départ pour les modules chargés avec des chemins relatifs. Quand définissant cette valeur pour le serveur Karma, il devra commencer par /base. Nous voulons que la baseUrl pour nos tests soit le même dossier que le url de base que nous avons dans src/main.js, de sorte que les besoins relatifs dans le fichier la source n’aura pas besoin de changer. Donc, comme nous voulons que notre URL de base soit à src /, nous devons écrire/base/src.
C'est déroutant pour le moins. Suis-je censé avoir une configuration baseUrl dans mon fichier main.js qui pointe vers '/ base'?
note: Ce message était valable pour Karma le 16 janvier 2014. Je ne suis pas certain de l'état actuel de cette bibliothèque. Ils ont peut-être corrigé leur logique de configuration étrange et ajouté des messages d'erreur significatifs. Sinon, cet article peut être probablement très utile en corrigeant les problèmes de configuration liés à Karma.
Ce type d'erreur se produit par une mauvaise configuration. Vous devez ajouter tout ce que votre test utilise dans le fichier pattern
s de votre fichier de configuration.
Par exemple:
module.exports = function (config) {
config.set({
basePath: './',
frameworks: ['jasmine', 'requirejs'],
files: [
{pattern: 'test/bootstrap.js', included: true},
{pattern: 'test/**/*.js', included: false},
{pattern: 'src/**/*.js', included: false},
{pattern: 'vendor/**/*.js', included: false}
],
exclude: [
],
reporters: ['progress'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Firefox'],
captureTimeout: 6000,
singleRun: false
});
};
Dans cet exemple, le bootstrap.js est le seul fichier included
de Karma dans le code HTML, les autres fichiers sont des dépendances qui sont chargés par le code dans le bootstrap.js . L'ordre des motifs est très important et malheureusement, il est loin d'être logique: le motif suivant ne remplace pas le précédent . Donc, si je donnais le modèle test/**/*.js
en premier et test/bootstrap.js
en second, cela ne fonctionnerait pas car le bootstrap ne serait pas inclus. Dans ces cas, Karma vous envoie un message "empty testsuite"
, qui est inutile si vous ne savez pas comment le configurer ...
Si vos tests tentent d'utiliser un fichier non couvert par les modèles fournis dans votre fichier de configuration Karma, vous obtiendrez le message d'erreur "There is no timestamp for xy"
, qui est très similaire au "empty testsuite"
mentionné précédemment. Si vous ne connaissez pas le système, vous ne saurez pas ce que cela signifie ou ce que vous devez faire pour le réparer ...
La partie exclude
de l'objet de configuration concerne les fichiers qui ont été ajoutés aux modèles de fichiers pour inclusion, mais que vous ne souhaitez pas inclure ou utiliser dans vos tests. Il peut s’agir par exemple de fichiers de configuration requirejs pour les environnements de développement et de production, etc.
Pour moi, c'était simplement l'erreur de définir basePath: 'base'
au lieu de baseUrl: '/base'
.
baseUrl: '/base'
ftw!
Le chemin de base doit identifier la racine de votre projet par rapport au fichier de configuration (karma.conf.js). Jetez un œil à cet exemple: https://github.com/karma-runner/karma/blob/v0.8.5/test/client/karma.conf.js
Dans le navigateur, j'ai aussi eu cette erreur à propos de l'horodatage, mais cela n'affecte rien. Les tests fonctionnent correctement. Je suppose que cela devrait être un avertissement plus qu'une erreur :-)
Jeff a raison, vous devez exclure le fichier de configuration requirejs de votre application, car "nous ne voulons pas démarrer l'application dans nos tests. [LINK] ".
Le fichier de configuration test-main.js
est un fichier distinct du fichier de configuration requirejs que votre application utilise, qui dans votre cas pourrait être config.js
ou main.js
, selon l'endroit où vous configurez vos requirejs.
Ils configurent tous les deux le chemin et les dépendances (il est possible qu’ils spécifient à peu près les mêmes), mais le premier consiste à fournir le support requirejs pour les tests que vous écrivez. L'ensemble de cette configuration requirejs est distinct de celle que vous utilisez dans votre application. Alors n'incluez pas le dernier, cela confond le Karma.
Et le lien ci-dessus est un Karma en état de marche avec la démo de its requirejs.
Après avoir essayé toutes les solutions postées sur différentes sources, Enfin je l’ai corrigé. Vérifiez-le ici: Erreur "sans horodatage" configurable # 6 .
Exemple tiré du problème du fichier karma.conf.js:
client: {
requireJsShowNoTimestampsError: '^(?!.*(^/base/app/node_modules/))'
}
dans mon fichier karma.conf.js, j'ai simplement exclu mon fichier qui contenait ma fonction require.config (dans mon cas, il s'agissait de config.js) et les erreurs ont disparu.
exclude: [
'app/config.js',
'bower_components/jasmine/**/*.js'
],
J'ai eu exactement la même erreur dans mon projet et j’ai trouvé que le meilleur moyen de déboguer le plus rapidement, c’est de lister les fichiers que notre karma a chargés.
Si vous avez utilisé karma init (sinon, faites-le simplement) et répondez OUI à la question sur l'utilisation de RequireJS, vous avez probablement un fichier comme celui-ci:
var tests = [];
var TEST_REGEXP = /(spec|test)\.js$/i;
var BASE_URL = '/base/build/js';
var BASE_URL_REGEXP = /^\/base\/build\/js\/|\.js$/g;
// Get a list of all the test files to include
Object.keys(window.__karma__.files).forEach(function (file) {
console.log(file;) // ADD THIS CONSOLE LOG TO LIST LOADED FILES
if (TEST_REGEXP.test(file)) {
var normalizedTestModule = file.replace(BASE_URL_REGEXP, '')
tests.Push(normalizedTestModule)
}
})
require.config({
// Karma serves files under /base, which is the basePath from your config file
baseUrl: BASE_URL,
paths: {
},
shim: {
},
deps: tests,
// we have to kickoff jasmine, as it is asynchronous
callback: window.__karma__.start
})
Ensuite, vous pouvez jouer avec votre fichierkaram.conf.jset charger de nouveaux fichiers pour vérifier ce qui se passe dans le chemin karma local.
Cette erreur peut également se produire lorsque les fichiers en question n'existent pas!
Vérifiez donc que le fichier pour lequel vous obtenez cette erreur existe bien dans votre projet!
Une fois que vous savez quels sont les fichiers, vous pouvez les ignorer en utilisant un modèle comme dans votre karma.conf.js
, s'il s'avère que leur existence devrait être ignorée dans certains cas:
exclude: [
'path/to/files/to/ignore/**/*.js'
]
Expansion de la réponse de @Naruto Sempai:
J'ai résolu ce problème en définissant d'abord l'attribut basePath
dans mon fichier karma.conf.js
. Ce chemin contient les chaînes nécessaires ../
(répertoire précédent) jusqu'à ce que mon chemin soit à la racine de mes fichiers source/test.
Ensuite, j'ai modifié mon fichier test-main.js
(contenant ma configuration RequireJS) et défini la baseUrl
sur /base
.
Maintenant, pas d'erreur d'horodatage.
-
Pour illustrer mon environnement et les chemins que j'ai configurés, voici un exemple d'installation basique:
Emplacement du fichier source: /Users/ben/some-project/src/main/resources/var/www/project/js/app
Emplacement du fichier de test: /Users/ben/some-project/src/test/var/www/project/
Emplacement de Karma Config: /Users/ben/some-project/src/test/var/www/project/karma.conf.js
Test RequireJS Emplacement de la configuration: /Users/ben/some-project/src/test/var/www/project/test-main.js
Mon karma.conf.js
:
module.exports = function (config) {
config.set({
basePath: '../../../../'
});
}
faire ma "racine" à /Users/ben/some-project/src/
.
Mon test-main.js
:
requirejs.config({
baseUrl: '/base'
});