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。