【发布时间】:2018-08-22 22:34:50
【问题描述】:
我正在复制 Angular 文档的一些示例以提高我对 Angular 单元测试的理解,当我无法弄清楚发生了什么时,我最终得到了一个简单的测试用例。
当我有一个从服务获取报价的单一方法“getQuote”时,这是我的 app.component.ts 文件。
@Component({...})
export class AppComponent {
errMsg: string;
quote: Observable<string>;
constructor (private twainService: TwainService) {}
getQuote () {
this.quote = this.twainService.getQuote().pipe(
catchError(err => {
this.errMsg = err;
return of('...');
})
);
}
}
然后,我创建了一个测试来验证我的 errMsg 属性是否正确更新,以防我的 twainService.getQuote 方法出错:
describe('AppComponent', () => {
let fixture: ComponentFixture<AppComponent>;
let component: AppComponent;
let getQuoteSpy;
beforeEach(async(() => {
const twainService = jasmine.createSpyObj('TwainService', ['getQuote']);
getQuoteSpy = twainService.getQuote.and.returnValue(of(testQuote));
TestBed.configureTestingModule({
declarations: [
AppComponent
],
providers: [
{ provide: TwainService, useValue: twainService }
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(AppComponent);
component = fixture.debugElement.componentInstance;
});
it('should get error msg when TwainService fails', async(async () => {
const errMsg = 'TwainService fails';
getQuoteSpy.and.returnValue(throwError(errMsg));
component.getQuote();
await fixture.whenStable();
expect(component.errMsg).toBe(errMsg);
}));
});
但问题是:这个测试总是失败,我看不出有什么问题。
四处玩耍,我设法发现添加如下所示的“fixture.detectChanges()”可以使测试正常工作,但我不明白为什么。我以为 detectChanges 方法只用于将更改传播到组件视图。
it('should get error msg when TwainService fails', async(async () => {
const errMsg = 'TwainService fails';
getQuoteSpy.and.returnValue(throwError(errMsg));
component.getQuote();
fixture.detectChanges();
await fixture.whenStable();
expect(component.errMsg).toBe(errMsg);
}));
我用 async、fakeAsync 和直接发出错误的同步 observable 和异步 observable 进行了测试,结果总是一样的。
如果有人可以帮助我了解那里发生了什么:)
【问题讨论】:
标签: angular unit-testing asynchronous jasmine observable