我喜欢在进行unittest时传递完成回调的能力,以明确控制何时完成单元测试。任何人都可以解释在使用Angular 2时如何将它与依赖注入相结合?
多一点背景:
具有回调函数的普通单元测试如下所示:
it('should work with done', (done: Function) => {
setTimeout(() => {
a.test();
}, 1000);
a.test = () => {
console.log('zweiter test');
expect(true).toBeFalsy();
done();
};
由角度2框架生成的单元测试使用注入,如下所示:
it('should be defined', inject([TxparserService], (service: TxparserService) => {
expect(service).toBeTruthy();
}));
我想同时使用回调函数和依赖注入。这看起来怎么样?
答案 0 :(得分:10)
不确定你是否可以。就个人而言,我已经停止使用这种注射方式有几个原因:1。它非常冗长,2。你需要为每个测试用例不断重复它。其他几个选项是:
使用beforeEach
let service: TxparserService;
beforeEach(() => { // configure });
beforeEach(inject([TxperserverService], (svc: TxparserService) => {
service = svc;
}));
对我来说,上面的beforeEach
,仍然让我首先担心的是啰嗦,所以我现在就这样做了
let service: TxparserService;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [ TxparserService ]
});
service = TestBed.get(TxparserService);
});
答案 1 :(得分:7)
如果您需要将done
- 样式的异步测试与注射结合起来,您可以简单地执行以下操作:
it('should work', (done) => inject([SomeService], (someService: SomeService) =>
{
expect(true).toEqual(true);
done();
})());
确保您立即调用inject
返回的函数。
PS:有时async
和fakeAsync
都不起作用,你仍然需要以老派的方式done
...
PPS:如果有人有兴趣如何使用jasmine-marbles来解决Observable的时间相关操作问题,请看一下这个简短的例子:marble-scheduler-injector.ts
答案 2 :(得分:3)
我能够成功地将fakeAsync与inject结合起来。所以看起来如下:
it('should be defined', fakeAsync(inject([TxparserService], (service: TxparserService) => {
expect(service).toBeTruthy();
})));
您可以将其与https://angular.io/guide/testing#the-fakeasync-function
中描述的tick()
功能结合使用