错误的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(); }));