在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'实例化,我必须递归地解析所有依赖项。如何正确处理?
谢谢!
答案 0 :(得分:0)
我只想使用TestBed
。 HTTP_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
请求时,都会有连接,我们可以发送模拟回复。