【发布时间】:2017-03-07 00:59:43
【问题描述】:
我正在使用 angular 2.1 的最新 angular-cli。我要写的组件测试很简单:从服务中获取一些数据并显示出来。
当数据仅显示在段落中时,它可以工作,但当它绑定到文本区域时,它不会。
以下是我的模板的摘录:
<p *ngIf="!isBusy" class="twain">
<i>{{settings.blockLoginMessage}}</i>
</p>
<textarea
id="blockLoginMessage"
name="blockLoginMessage"
[(ngModel)]="settings.blockLoginMessage"
class="form-control">
</textarea>
以及相应的测试:
describe('SettingsComponent', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [SharedModule, TranslateModule.forRoot()],
declarations: [SettingsComponent],
providers: [
Overlay,
ToastsManager,
ViewContainerRef,
TranslateService,
SettingsService
]
});
fixture = TestBed.createComponent(SettingsComponent);
comp = fixture.componentInstance;
settingsService = fixture.debugElement.injector.get(SettingsService);
getSettingsSpy = spyOn(settingsService, 'getSettings')
.and.returnValue(Observable.of(new Settings(true, false, 'test')).delay(500).toPromise());
setSettingsSpy = spyOn(settingsService, 'setSettings')
.and.returnValue(Observable.of(true).delay(500));
fixture.detectChanges();
});
it('should create the component', () => {
expect(comp).toBeTruthy();
});
it('should show busy indicator as long as there are no settings', () => {
let busyPanel = fixture.debugElement.query(By.css('#busyPanel'));
expect(busyPanel).not.toBeNull('cant find busy');
});
it('should show loaded settings after observable finished (done)', done => {
fixture.detectChanges();
// get the spy promise and wait for it to resolve
getSettingsSpy.calls.mostRecent().returnValue.then(() => {
fixture.detectChanges();
let de = fixture.debugElement.query(By.css('.twain'));
let el = de.nativeElement;
expect(el.textContent).toBe('test', 'show loaded settings');
let de2 = fixture.debugElement.query(By.css('#blockLoginMessage'));
let el2: HTMLTextAreaElement = de2.nativeElement;
expect(el2.textContent).toBe('test', 'show loaded settings');
done();
});
});
});
有没有人暗示为什么这不起作用?
此外,我对async 和fakeAsync 的尝试完全失败了,因为我像上面那样延迟了我的承诺。
【问题讨论】:
-
fixture.isStable() 返回 false 顺便说一句
-
您能否发布一个完整的示例,最好只使用一个虚拟组件和服务,所有这些都发布在一个页面中,我们可以按原样复制粘贴和测试。并且请仅包括重现问题所必需的内容(即没有翻译模块)或不涉及解决如何测试 ngModel 问题的任何其他内容。这就是MVCE 的含义
标签: javascript unit-testing angular angular-cli