63 votes

Tests unitaires Angular 2 - erreur de chargement de 'ng:///DynamicTestModule/module.ngfactory.js'.

J'ai une application angular 2 webpack, toute la configuration webpack,karma créée selon le guide webpack d'angular.io. Je n'utilise pas aot. J'écris des tests unitaires Jasmine pour tester mes composants. J'ai d'abord essayé sans bloc asynchrone, dans ce cas, le test unitaire est exécuté seulement jusqu'à l'appel de fixture.detectChanges(), le code après cela n'est pas exécuté. Il semble que l'appel fixture.detectChanges soit bloqué à l'infini.

J'ai essayé d'inclure le code dans un bloc asynchrone. J'obtiens alors l'erreur suivante. Error:Failed to execute 'send' on 'XMLHttpRequest' : Failed to load 'ng:///DynamicTestModule/module.ngfactory.js'.


Code sans asynchronisme

beforeeach(()=> {
TestBed.configureTestingModule({
imports:[],
declaration :[Mycomp],
providers:[{ provide:MyService, useclass:MyMockService}]
});
 fixture=TestBed.createComponent(Mycomp);
 console.log(' before detect changes'):
 fixture.detectChanges():
 console.log('after detect changes');// this is not getting   
    logged .. karma shows 0 of 1 executed successfully

 });

Avec l'asynchronisme

  beforeeach(async(()=> {
 TestBed.configureTestingModule({
  imports:[],
  declaration :[Mycomp],
  providers:[{ provide:MyService,       useclass:MyMockService}]
  });
   fixture=TestBed.createComponent(Mycomp);
    fixture.detectChanges():
  }));

Obtention de l'erreur "Failed to load dynamictestmodule/module.ngfactory.js".

104voto

newclearwinter Points 1024

J'ai rencontré ce problème moi-même hier. Le problème était que j'avais une propriété Input() sur ma classe de composant que je n'avais pas définie dans le test. Ainsi, par exemple, dans mon-composant.ts :

@Component({
  selector: 'my-component'
})
export class MyComponent {
  @Input() title: string;
}

et mon-composant.spec.ts :

beforeEach(() => {
  fixture = TestBed.createComponent(MyComponent);
  component = fixture.componentInstance;
  component.title = 'Hello there!' // <-- this is required!
  fixture.detectChanges();
});

Ou vous pourriez fournir une valeur par défaut dans le composant quelque part. Dans tous les cas, le test se plantera si des entrées ne sont pas définies et vous obtiendrez cette erreur peu intuitive.

Note : La course ng test -sm=false donnera le message d'erreur réel causant le problème. Crédit : https://stackoverflow.com/a/45802115/61311

2 votes

C'est vrai, mais j'obtiens aussi parfois la même erreur lorsque j'ai un service qui n'est pas correctement simulé ou si mon composant essaie d'accéder à une valeur nulle renvoyée par l'un de ces services. Cette réponse est toujours valable, mais attention, elle ne résout pas toujours le problème.

26 votes

Je viens de comprendre que vous pouvez obtenir un meilleur message d'erreur en définissant le paramètre sourcemap à false : ng test --sourcemap=false

0 votes

@blo0p3r C'est une bonne idée ! En mettant sourcemap à false, l'erreur inutile XMLHttpRequest devient l'erreur réelle Root.

77voto

Dan Field Points 12945

Pour découvrir la cause réelle de l'erreur, désactivez les cartes sources :

Pour angular-cli >= v6.x :

ng test --source-map=false

Pour angular-cli v1.x :

ng test -sm=false

Vous verrez alors une meilleure erreur, par exemple "Impossible de lire la propriété 'x' d'undefined". dans le fichier source qui cause l'erreur. . Pour une raison quelconque, il y a un bogue avec les cartes de source en ce moment dans les tests, et vous obtenez juste cette erreur cryptique.

0 votes

-sm o -sourcemaps ne fonctionne pas de mon côté (version CLI ?), au lieu de cela -source-map travaux.

18voto

Artur Points 478

Exécuter des tests avec --sourcemaps=false ne fera pas échouer Karma silencieusement mais vous donnera quelques détails sur l'erreur.

6voto

yugantar kumar Points 918

Complément à la réponse de Dan Field

C'est un problème avec le Angular Cli version 1.2.2 ou plus récent . Exécutez votre test avec --sourcemaps=false et vous obtiendrez les bons messages d'erreur.

ng test --sourcemaps=false

Le raccourci pour cela est :

ng test -sm=false

Voir les détails ici : https://github.com/angular/angular-cli/issues/7296

0 votes

Cela devrait être un commentaire, ou mieux encore, une modification de l'autre réponse.

1 votes

Merci @AndréWerlang pour votre commentaire utile. Nous vous en remercions !

5voto

Niles Tanner Points 2621

J'ai également eu ce problème et il était dû à des données factices mal formées. Dans mon composant, j'avais un service qui faisait un appel http.

quelque chose comme : ( code de service )

getData() {
   return this.http.get(obj);
}

Dans le composant, j'ai appelé cette fonction et je m'y suis abonné : ( code de composant )

this.service.getData().subscribe((data) => {
  this.componentData = data.things; //**<=== part that broke everything**
}, (error) => {
  console.log(error);
});

Solution :

Lorsque j'ai simulé la fonction de service, je n'ai pas réussi à renvoyer les données qui avaient l'attribut things . C'est ce qui a causé l'échec de XMLHttpRequest, je suppose que pour Angular, l'erreur semblait se produire comme s'il s'agissait d'une requête HTTP. En m'assurant que je renvoie les attributs corrects sur toutes les requêtes HTTP simulées, les problèmes ont été résolus.

J'espère que ça va éclaircir les choses. Voici le code pour l'implémentation de l'objet fantaisie.

( composant.specs )

function fakeSubscribe(returnValue,errorValue) {
  return {
    subscribe:function(callback,error){
      callback(returnValue);
      error(errorValue);
    }
  }
}

 class MockService {
      getData() {
        var fakeData = {
          things:[]
        }
        return fakeSubscribe(fakeData,0);
      }
   }

1 votes

J'essayais de comprendre ça, et un concept similaire. Mes services fictifs retournaient des types autres que Observable, alors que le composant attendait un Observable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X