如何将完成回调与注入Angular 2单元测试相结合

7
我很喜欢在编写单元测试时能够传入一个回调函数来明确控制何时认为单元测试已完成。请问有人可以解释如何在使用Angular 2时与依赖注入结合使用呢?
稍微了解一下背景:
普通的带有回调函数的单元测试看起来像这样:
it('should work with done', (done: Function) => {
    setTimeout(() => {
      a.test();
    }, 1000);
    a.test = () => {
      console.log('zweiter test');
      expect(true).toBeFalsy();
      done();
    };

一个由Angular 2框架生成的单元测试使用注入,代码如下:
  it('should be defined', inject([TxparserService], (service: TxparserService) => {
    expect(service).toBeTruthy();
  }));

我想同时使用回调函数和依赖注入,这样会怎么样呢?

3个回答

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);
    });
    

谢谢回答。这对我有用,所以我现在将其标记为答案。 - Nikola Schou

8
如果您需要将“完成”式异步测试与注入结合使用,可以简单地执行以下操作:
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


这可能与以下相关:https://github.com/angular/angular/issues/10127 - vivri
@vivri 没错,但是最近我转用了 jasmine-marbles,现在我不需要任何类型的异步操作(至少对于 Observables 来说)- 它完全同步工作!PS:为了使其正常工作,您必须将 jasmine-marbles 中的 TestScheduler 注入到基于时间的 Observable 操作中。 - Pavel Agarkov

3

我成功地将fakeAsync与inject结合使用。代码如下:

it('should be defined', fakeAsync(inject([TxparserService], (service: TxparserService) => {
  expect(service).toBeTruthy();
})));

你可以结合https://angular.io/guide/testing#the-fakeasync-function中描述的tick()函数来使用。

2
使用“async”对我也起作用。 - Jim Doyle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接