Angular 2unit testing – 获取错误无法加载“ng:///DynamicTestModule/module.ngfactory.js”

我有angular 2 webpack应用程序,所有webpack,根据angular.io webpack指南创build的业力configuration。 我不使用aot。 我正在写茉莉花unit testing规范来testing我的组件。 首先,我尝试没有asynchronous块,在这种情况下,unit testing只是得到执行,直到fixture.detectChanges()调用,之后的代码不会得到执行。 好像fixture.detectChanges调用无限地被阻塞。

我试图通过在asynchronous块中包含代码。 然后我得到以下错误。 错误:无法在'XMLHttpRequest'上执行'发送':无法加载'ng:/// DynamicTestModule /module.ngfactory.js'


代码没有asynchronous

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 }); 

与asynchronous

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

出现错误无法加载dynamictestmodule / module.ngfactory.js

我昨天自己遇到这个问题。 问题是我有我的组件类Input()属性,我没有在testing中设置。 例如,在my-component.ts中:

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

和my-component.spec.ts:

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

或者你可以在某个地方提供一个默认值。 无论哪种方式,如果没有设置任何input,testing将会崩溃,您将得到这个不直观的错误。

注意:运行ng test -sm=false会导致实际的错误信息导致问题。 信用: https : //stackoverflow.com/a/45802115/61311

要查明真正导致错误的原因,请禁用源映射:

 ng test -sm=false 

然后你会看到一个更好的错误,例如:“ 在实际的源文件中,导致错误的 ”不能读取属性'undefined“。 出于某种原因,现在在testing中存在一个源代码的错误,而你只是得到这个神秘的错误。

使用--sourcemaps=false运行testing不会使Karma无声地失败,而是给你一些关于错误的细节。

我也有这个问题,这是由于歪曲的数据。 在我的组件中,我有一个服务,使http呼叫。

例如:( 服务代码

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

在我调用这个函数的组件中,订阅了它:( 组件代码

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

解:

当我嘲笑服务function时,我没有返回具有属性的数据。 这是什么导致XMLHttpRequest失败,我猜测它看起来像错误发生,就好像它是HTTP请求。 确保我在任何模拟的HTTP请求上返回了正确的属性,修复了这些问题。

希望这清除了事情。 下面是模拟的实现代码。

component.specs

 function fakeSubscribe(returnValue,errorValue) { return { subscribe:function(callback,error){ callback(returnValue); error(errorValue); } } } class MockService { getData() { var fakeData = { things:[] } return fakeSubscribe(fakeData,0); } } 

这是我在Angular遇到的最欺骗性的错误信息。

在我的情况下,它与发送没有任何关系,与XmlHttpRequest无关 – 至less不会在尝试按照消息的时候猜到的级别。

这也是嘲笑一个类,即ngrx /店。 我在一个容器中引入了两个Observable方法,这些方法之前没有被包含在我的模拟类中,而当我开始使用这些方法时,我忘了这么做。 一旦添加到模型,错误消失。

…离开Karma很高兴能够执行XmlHttpRequest的“发送”,无论它是什么意思。

第二天我被同样的错误咬了 – 这次问题被埋在了HTML文件中。 对*ngIf使用简单的数组长度testing

 <ng-container *ngIf="myArray.length > 0"> 

必须被重构

 <ng-container *ngIf="myArrayNotEmpty"> 

与吸气剂如下:

 get myArrayNotEmpty(){ return this.myArray && this.myArray.length > 0; } 

我有点恼火,虽然这样的各种原因被一个非常误导和无益的信息所覆盖。

加上丹菲尔德的答案

这是Angular Cli 1.2.2或更新版本的问题。 用--sourcemaps=false运行你的testing,你会得到正确的错误信息。

ng test –sourcemaps = false

速记这是:

ng test -sm = false

在这里看到详细信息: https : //github.com/angular/angular-cli/issues/7296

在我的情况下,我的模拟服务缺lessngOnInit方法中的组件访问的一些公共variables。