错误的angular度testing无法在“XMLHttpRequest”上执行“发送”

我试图testing我的angular4.1.0组件 –

export class CellComponent implements OnInit { lines: Observable<Array<ILine>>; @Input() dep: string; @Input() embedded: boolean; @Input() dashboard: boolean; constructor( public dataService: CellService, private route: ActivatedRoute, private router: Router, private store: Store<AppStore>) { } } 

然而,一个简单的“应该创build”testing抛出这个神秘的错误…

NetworkError:无法执行“XMLHttpRequest”上的“发送”:未能加载“ng:///DynamicTestModule/module.ngfactory.js”。

所以我发现这个问题,这表明问题是组件有@Input)_参数没有设置,但是,如果我修改我的testing像这样:

  it('should create', inject([CellComponent], (cmp: CellComponent) => { cmp.dep = ''; cmp.embedded = false; cmp.dashboard = false; expect(cmp).toBeTruthy(); })); 

那么我仍然得到同样的问题,同样,如果我从组件中删除@Input()注释,仍然没有区别。 我怎样才能通过这些testing?

这是新的angular度Cli的问题。 用--sourcemaps=false运行你的testing,你会得到正确的错误信息。

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

编辑:

速记这是:

ng test -sm=false

对于我的情况有一个模拟数据的问题,在Array情况下,我从模拟返回string

 someApi = fixture.debugElement.injector.get(SomeApi); spyOn(someApi, 'someMethod') .and.returnValue(Observable.of('this is not a string but array')); 

错误信息是真的分心,并没有告诉实际的错误。 运行ng test --source=false指出正确的错误和行,并帮助我快速修复它。

当你模拟数据不完整或不正确时,很多时候会发生这种情况。

这可能与Chrome隐藏实际testing错误有关。 testing区域会混淆一些模拟http工厂,它不能加载,因此这是它会报告的错误。 最有可能的错误将会出现在一个对象所在的ngOnInit区域,例如,期望子对象,并且它们没有被定义。

要尝试find错误的底部,请暂时切换到PhantomJS,这似乎不会受到这些初始化错误的影响,并且希望能够向您报告实际的错误。 有几次,我发现在初始化期望的对象没有完成。 IE:

  fixture = TestBed.createComponent(MyComponent); component = fixture.componentInstance; component.object = {} // should be: component.object = {"innerObjectThatIsNeeded" : []} 

更正对象允许PhantomJS完成,Chrome也可以继续下一个testing。

除此之外,我还没有看到从Chrome中删除问题的解决scheme。 一如既往试图采取“删除代码,直到错误消失”的策略来追查错误。

在我的情况下,罪魁祸首是observable.timeout(x).retry(y)应用在服务类级别返回的Observable的某个地方,然后再次在使用该服务的组件。

一切正常在浏览器中正常工作,直到1.4。 然后在Karmatesting期间开始失败(有这样一个愚蠢的错误)。 这个解决scheme当然是要清理这些超时/重试操作符。

对我来说,这个消息在我的testing中出现一个模拟错误的时候出现:通常你在你的testing引导程序中提供了mockService。 如果你的模拟是不完整或虚假的,那么angular度返回这个愚蠢的错误。

更多关于我的情况在这里

如上面build议的: https : ngOnInit我的问题是在我的ngOnInit 。 我打电话给一个模仿招摇的REST控制器代理。 它是返回null,我订阅null,这是行不通的…

错误回来了:

Failed to load ng:///DynamicTestModule/MockNodeDashboardComponent_Host.ngfactory.js: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.

我使用ts-mockito修复了这个问题: https : //github.com/NagRock/ts-mockito

我添加了代码来创build一个模拟实例,如下所示:

 import { mock, instance, when } from 'ts-mockito'; import { Observable } from 'rxjs/Observable'; import { Observer } from 'rxjs/Observer'; import { MockScenario } from './vcmts-api-client/model/MockScenario'; const MockVcmtsnodemockresourceApi: VcmtsnodemockresourceApi = mock(VcmtsnodemockresourceApi); const obs = Observable.create((observer: Observer<MockScenario[]>) => { observer.next(new Array<MockScenario>()); observer.complete(); }); when(MockVcmtsnodemockresourceApi.getMockScenariosUsingGET()).thenReturn(obs); const instanceMockVcmtsnodemockresourceApi: VcmtsnodemockresourceApi = instance(MockVcmtsnodemockresourceApi); 

然后将实例添加到testing的提供程序数组中,如下所示:

  beforeEach(async(() => { TestBed.configureTestingModule({ ... providers: [ ... { provide: VcmtsnodemockresourceApi, useValue: instanceMockVcmtsnodemockresourceApi }, ... ] }).compileComponents(); }));