如何将完成的回调与注入角度2单位测试相结合

时间:2017-02-04 23:28:12

标签: angular asynchronous jasmine

我喜欢在进行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();
  }));

我想同时使用回调函数和依赖注入。这看起来怎么样?

3 个答案:

答案 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:有时asyncfakeAsync都不起作用,你仍然需要以老派的方式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()功能结合使用