我正在完成Angular2测试指南,并希望为ngOnInit()函数编写测试。
编程指南的Routing部分中的一个具有以下格式。数据来自解析器。当调用fixture.detectChanges()时,调用ngOnInit()。
let org: Org = null;
let savedOrg: Org = null;
...
ngOnInit(): void {
let that = this;
this.route.data
.subscribe((data: { org: Org }) => {
that.org = data.org;
that.savedOrg = new Org(that.org);
});
}
在我之前的问题中,我专注于通过解析器获取数据。用户" peeskillet"慷慨地给了我:
let routeStub: any = { data: org1 };
然而,这个(routeStub.data)是在ngOnInit()中看到的,并且我的代码因为没有调用subscribe()而失败,这不是我的存根中的。
(而不是通过大量更新对该问题着色,我决定创建这个新问题。)
实际上,我不想用mock来替换this.route.data的ngOnInit()版本。相反,我需要将数据传递给现有的this.route.data.subscribe()。
我该怎么做?
谢谢,
杰罗姆。
03/11更新解决方案
对我有用的只是与peeskillet推荐的略有不同。一,我的it()函数不使用其中的async()函数。二,我的routeStub observable需要一个命名属性" org",如Observable.of({' org':org1})。
以下是我在一个地方的工作代码:
let org1: Org = new Org({ ... details that fill it ... });
let routeStub: any = { data: Observable.of( { org: org1 } ) } ;
...
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [ FormsModule, RouterTestingModule ],
providers : [
{ provide: ActivatedRoute, useValue: routeStub }
],
declarations: [ OrgDetailComponent ],
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(OrgDetailComponent);
...
});
it('should display original title', () => {
fixture.detectChanges();
fixture.whenStable().then(() => {
comp = fixture.componentInstance;
de = fixture.debugElement.query(By.css('h2'));
el = de.nativeElement;
expect(comp.org).toEqual(org1);
expect(el.textContent).toContain("Edit");
});
});
然后在组件中:
public ngOnInit(): void {
let that = this;
this.route.data
.subscribe((data: { org: Org }) => {
that.org = data.org;
});
}