2017-10-17 55 views
1

我试图建立我@Injectable存储服务的测试。测试异步注射服务

@Injectable() 
export class StorageService {... 

constructor(private platform: Platform, 
    public instanceService: InstanceService, 
    private logger: LoggingService, 
    private database: SQLite = null) {... //injecting a db mock 

我已经创建了成功测试了几个版本,但我知道他们只许成功,因为他们是异步并且误报的错误。

这里的设置。

describe('Storage Service tests',() => { 
beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
     declarations: [], 
     providers: [ 
      StorageService, 
      { provide: Platform, useClass: PlatformMock }, 
      { provide: InstanceService, useClass: InstanceServiceMock }, 
      { provide: LoggingService, useClass: LoggingServiceMock }, 
      { provide: ConfigurationService, useClass: ConfigurationServiceMock }, 
      { provide: SQLite, useClass: DBMock }, 
      MockBackend, 
      BaseRequestOptions, 
      { 
       provide: Http, 
       useFactory: (mockBackend, options) => { 
        return new Http(mockBackend, options); 
       }, 
       deps: [MockBackend, BaseRequestOptions] 
      } 
     ], 
     imports: [ 
      HttpModule 
     ] 
    }).compileComponents(); 
})); 

在这里,我想测试setFailedImageUpdate

我挣扎知道如何既注入的服务,所以它初始化传中done用于异步完成。

it('should set failed image', (done) => { 
    let cu = new UnsavedImageUpdate(); 

    inject([StorageService, MockBackend], (storageService, mockBackend) => { 
     storageService.db = new DBMock(); 
     storageService.setFailedImageUpdate([cu]).then((res) => { 
      expect(res).toEqual("1234"); 
      done(); 
     })(); 
    }) 
}); 

我得到这个迭代的错误是:

Error: Timeout - Async callback was not invoked within timeout 
specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. 

如何将我的测试设置以共同喷射StorageService传中done

编辑:试图跟随@学习者的建议,我创造了这个:

it('should set failed image', async() => { 
    let cu = new UnsavedImageUpdate(); 
    var storageService = TestBed.get(StorageService); 
    storageService.db = new DBMock(); 
    storageService.setFailedImageUpdate([cu]).then((res) => { 
     expect(res).toEqual("1234"); 
    }) 
}); 

测试成功,但是当我调试到它,我得到这个错误:

'expect' was used when there was no current spec, 
this could be because an asynchronous test timed out 

回答

1

而不是使用inject,您可以使用TestBed.get(StorageService)得到您的测试方法注入的服务,您可以使用async从功能角度测试模块,等待异步操作完成,而不是使用done的。

使用这样做:

it('should set failed image', (done) => { 
    let cu = new UnsavedImageUpdate(); 
    var storageService = TestBed.get(StorageService); 
    storageService.db = new DBMock(); 
    storageService.setFailedImageUpdate([cu]).then((res) => { 
     expect(res).toEqual("1234"); 
     done(); 
    }) 
}); 
+0

你可以模拟一个样本? – paqogomez

+0

明白了!谢谢!! – paqogomez

+0

我很想看到一个版本的W/O完成,如果你想给它一个镜头。 – paqogomez