2017-09-27 2 views
7

Je travaille avec un projet de test, où j'écris une configuration de Jasmine Karma Javascript pur pour tester une configuration de Typescript pré-compilé. Cependant, je n'arrive pas à démarrer les cas de test.Cas de tests de jasmin ne se lançant pas à l'intérieur de définir dans compilé Typescript

Je peux voir les messages de la console qui proviennent de la machine à écrire compilée dans la console, mais cela ne démarre tout simplement pas les scripts de test. Notez que cela vient d'un AngularApp, mais cette partie entière vient d'une section a été faite et compilée sans Angular2.

Il n'y a pas de message d'erreur, en dehors de celui-ci, indiquant que des tests 0/0 ont été exécutés et qu'il n'y a pas d'horodatage pour "component/to/test".

Dans le fichier test.spec.js, je

define("testName", ["component/to/test"], function(component){ 
    describe("testing module", function(){ 
     it("should work", function(){expect(true).toEqual(true)}); 
    }) 
} 

Dans le fichier compilé tapuscrit, myTs.js

var requirejs, require, define; 
(function (global) { 

    define("component/to/test" ["depend", "ences"]), function(depend,ences) 
    { more code here }) 

    some compiled typescript here 
}); 
require.config({ 
    path: {path to javascript libs}, 
    shim: { ... } 
}) 

Dans mon fichier karma

basePath: '', 
frameworks: ['jasmine', 'requirejs'], 
files: [ 
    'lib1', 
    'lib2', 
    'spec/test-main.js', 
    {pattern: 'js/*.js', included: true, served: true}, 
    {pattern: 'spec/*.spec.js', included: false, served: true} 
], 
exclude: [], 
reporters: ['progress'], 
autoWatch: true, 
browsers: ['Chrome'] 

En mon test-main.js, que j'ai reçu de karma init après qu'il m'a demandé si je voulais utiliser requirejs.

var allTestFiles = [] 
var TEST_REGEXP = /(spec|test)\.js$/i 

Object.keys(window.__karma__.files).forEach(function (file) { 
if (TEST_REGEXP.test(file)) { 

    var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, '') 
    allTestFiles.push(normalizedTestModule) 
} 

}) 

require.config({ 
    baseUrl: 'base', 
    deps: allTestFiles, 
    callback: window.__karma__.start 
}) 

commentaires et certains codes non liés ont été supprimés pour l'espace.

Répondre

1

Ce que vous essayez de faire peut être fait. Je l'ai fait beaucoup de nombreuses fois, sans aucun problème.

Vous devez toujours exécuter RequireJS avec l'option de configuration enforceDefine activée:

require.config({ 
    enforceDefine: true, 
    // Anything else you need. 
}); 

car elle révèle des problèmes qui peuvent passer inaperçues. La seule fois où vous ne voulez pas cela est activé si vous pouvez nommer une raison importante pour laquelle enforceDefine est mauvais pour votre cas spécifique.

Un problème majeur dans le code que vous affichez est que vous êtes des noms de module de codage en dur dans les appels define. Comme define("testName", ... Vous ne devriez pas faire cela. Supprimez les noms de modules de vos appels define. Les noms de modules codés en dur sont ajoutés par l'optimiseur lorsque vous lui demandez de créer des groupes de modules. Il y a quelques cas où vous voudrez peut-être coder un nom en dur, mais ces cas sont rares et, à moins que vous ne puissiez nommer une bonne raison valable pour laquelle vous avez besoin d'un nom codé en dur, ne le faites pas.

Dans le cas de votre fichier de test, le nom codé en dur est particulièrement problématique. test-main.js dirige RequireJS pour charger vos fichiers de test. Il nécessite effectivement un module nommé quelque chose comme spec/test.spec. Lorsque RequireJS charge réellement votre fichier JavaScript correspondant à ce module, ce qu'il trouve est une définition pour un module nommé testName. Donc, il ne trouve pas le module spec/test.spec et il échoue silencieusement car enforceDefine est faux.

Le nom codé en dur component/to/test que vous attribuez à define dans myTs.js fonctionne probablement correctement étant donné la configuration que vous affichez. Je ne recommande toujours pas d'utiliser un nom codé en dur ici. Vous dites:

il n'y avait pas horodatage pour « composant/à/test »

Si vous voulez dire un horodatage Karma, alors il ne peut y avoir parce que vous ne disposez pas d'un fichier avec ce nom.

1

Vous ne devez pas compiler les fichiers de spécification avec tsc, puis exécuter le karma sur les fichiers js.

Vous devez karma de configuration avec les chargeurs dactylographiées, c'est un paquet que vous devriez essayer avec un échantillon de configuration:

https://www.npmjs.com/package/karma-typescript#configuration

Si cela est v2 angulaire + projet, vous êtes certainement devrait utiliser @ angulaire/cli

https://github.com/angular/angular-cli

Il est pris en charge par l'équipe angulaire, et vous donne beaucoup de choses de fantaisie, comme:

  • prod construire
  • construire AOT
  • configuration universel facile
  • configs karma et protractor, etc.