我还在为我的Angular应用程序编写测试。我有一个测试,它修改一个Org对象,保存更改,然后证明已经保留了更改。但是,测试没有看到变化。
我保存更改的模拟组织服务:
@Injectable()
export class MockOrgService {
constructor() { }
public save(org: Org): Observable<Org> {
let savedOrg: Org = new Org(org);
savedOrg.address2 = 'Saved with id: ' + org.id;
return Observable.of(savedOrg);
}
}
我的模拟路由器:
beforeEach(async(() => {
routeStub = { data: Observable.of( { org: org1 } ), snapshot: {} } ;
TestBed.configureTestingModule({
imports: [ FormsModule, RouterTestingModule ],
providers : [
{ provide: DialogService, useClass: MockDialogService },
{ provide: GlobalsService, useClass: MockGlobalsService },
{ provide: OrgService, useClass: MockOrgService },
{ provide: ActivatedRoute, useValue: routeStub }
],
declarations: [ OrgDetailComponent ],
})
.compileComponents();
}));
正在测试我的组件功能:
private gotoParent(): void {
this.router.navigate(['../'], { relativeTo: this.route });
}
public save(): void {
this.error = null;
let that = this;
this.orgService
.save(that.org)
.subscribe(
(org: Org): void => {
that.org = org;
that.savedOrg = new Org(org);
that.gotoParent();
},
error => this.error = error
);
}
我的测试:
it('responds to the Save click by saving the Org and refilling the component', async(() => {
fixture.detectChanges();
fixture.whenStable().then(() => {
comp.org.id = 2;
comp.org.name = 'Another Org';
let elButton = fixture.debugElement.query(By.css('#save'));
elButton.nativeElement.click();
fixture.detectChanges();
fixture.whenStable().then(() => {
expect(comp.error).toBeNull();
expect(comp.savedOrg.id).toEqual(2);
expect(comp.savedOrg.name).toEqual('Another Org');
expect(routeStub).toHaveBeenCalledWith(['../']);
});
});
当我使用断点时,我看到运行click()时调用OrgService.save(),并且在组件save()函数中调用了that.savedOrg。但是当测试进入expect()函数时,comp.savedOrg处于其原始值。好像有两个组件实例。
FWIW,在设置或未设置之后,我的savedOrg我的函数然后尝试路由。我反而得到一个错误:
Error: Expected a spy, but got Object({ data: ScalarObservable({ _isScalar: true, value: Object({ org: Org({ id: 2, [SNIP]
我不确定我应该怎么做才能说出已经调用了“goToParent”路由。
提前感谢您的帮助,
杰罗姆。
答案 0 :(得分:0)
我想出了测试规范功能中未见到的&#34;&#34;问题。我在第一个whenStable()之后错过了一行,它应该是:
comp = fixture.componentInstance;
这使一切都同步正常。现在我必须弄清楚如何进行路线测试。那是另一份工作。
杰罗姆。