在Angular2 final中使用提供程序依赖项进行隔离的单元测试

时间:2016-10-21 13:25:19

标签: unit-testing angular

在angular2隔离单元测试中(没有可用的测试平台)我想提供一个具有依赖性的服务。关于测试的文档说他们没有准备dependendy注入提供和创建新的实例。文档列表中的示例:

let service: FancyService;
beforeEach(() => { service = new FancyService(); });

但是,如果我的服务本身具有依赖性呢?例如,我想要实例化的服务'ClientService'取决于Http模块(它本身依赖于'ConnectionBackend'和'RequestOptions')和另一个名为'LoginService'的自定义服务。在angular2 rc4上我会写:

beforeEach(() => addProviders([
    {provide: ClientsService, useClass: ClientsServiceMock},
    LoginService,
    HTTP_PROVIDERS
]));

显然在Angular2 final(2.0.0)中,来自@ angular / core / testing的addProviders不再可用。

如果我想用'new'实例化,我必须递归地解析所有依赖项。如何正确处理?

谢谢!

1 个答案:

答案 0 :(得分:0)

我只想使用TestBedHTTP_PROVIDERS已不再可用,因为所有提供商都包含在HttpModule中。因此您需要将其导入TestBed。如果不使用TestBed,您可以创建一个独立的注入器,但这需要手动添加所有提供程序。这不值得。测试看起来像

import { MockBackend, MockConnection } from '@angular/http/testing';
// all other HTTP related stuff from `@angular/http`

let service: FancyService;
let backend: MockBackend;

beforeEach(() => {
  TestBed.configureTestingModule({
    imports: [ HttpModule ],
    providers: [
      FancyService, LoginService, MockBackend, BaseRequestOptions,
      {provide: ClientsService, useClass: ClientsServiceMock},
      {
        provide: Http,
        deps: [ MockBackend, BaseRequestOptions ],
        useFactory: (backend: MockBackend, options: BaseRequestOptions) => {
          return new Http(backend, options);
        }
      }
    ]
  });
  service = TestBed.get(FancyService);
  backend = TestBed.get(MockBackend);
});

it('..', async(() => {
  backend.connections.subscribe((conn: MockConnection) => {
    let resOptions = new ResponseOptions({ body: someJsonBody });
    let res = new Response(resOptions);
    conn.mockRespond(res);
  });

  service.getSomething().subscribe(res => {
    expect(res.json()).toBe(someBody);
  });
}));

在此,我们正在订阅MockBackend.connections。每当有人发出Http请求时,都会有连接,我们可以发送模拟回复。