上下文
我创建了一个ApiService
类能够处理我们自定义的API查询,同时使用我们自己的串行器+其他功能。
ApiService
的构造函数签名是:
constructor(metaManager: MetaManager, connector: ApiConnectorService, eventDispatcher: EventDispatcher);
-
MetaManager
是一种注射服务,处理的API metadatas。 -
ApiConnectorService
是被包裹服务Http
添加我们的自定义页眉和签名系统。 -
EventDispatcher
是基本的Symfony的事件调度系统,以打字稿。
问题
当我测试的ApiService
,我做初始化beforeEach
:
beforeEach(async(() => {
TestBed.configureTestingModule({
imports : [
HttpModule
],
providers: [
ApiConnectorService,
ApiService,
MetaManager,
EventDispatcher,
OFF_LOGGER_PROVIDERS
]
});
}));
并能正常工作。
然后,添加我的第二个规范文件,这是ApiConnectorService
,与此beforeEach
:
beforeEach(async(() => {
TestBed.configureTestingModule({
imports : [HttpModule],
providers: [
ApiConnectorService,
OFF_LOGGER_PROVIDERS,
AuthenticationManager,
EventDispatcher
]
});
}));
和所有的测试失败,此错误:
错误:无法解析ApiService所有参数:(MetaManager,此事件?)。
- 如果我删除
api-connector-service.spec.ts
( ApiConnectorService
“从我的加载测试小号规范文件), ApiService
的测试一定会成功。 - 如果我删除
api-service.spec.ts
( ApiService
“从我的加载测试小号规范文件), ApiConnectorService
的测试一定会成功。
为什么我有这样的错误? 这似乎是我的两个文件的背景是冲突的,我不知道为什么,以及如何解决这个问题。
这是因为Http
服务不能从解决HttpModule
,在测试环境中。 它是依赖于平台的浏览器。 你甚至不应该试图在测试过程中,以使XHR调用反正。
为此,角度提供了MockBackend
为Http
使用的服务。 我们用这个模拟后端订阅连接在我们的测试,并在每个连接时,我们可以嘲笑的响应。
这里是你可以关闭的工作很短的完整的例子
import { Injectable } from '@angular/core'; import { async, inject, TestBed } from '@angular/core/testing'; import { MockBackend, MockConnection } from '@angular/http/testing'; import { Http, HttpModule, XHRBackend, ResponseOptions, Response, BaseRequestOptions } from '@angular/http'; @Injectable() class SomeService { constructor(private _http: Http) {} getSomething(url) { return this._http.get(url).map(res => res.text()); } } describe('service: SomeService', () => { beforeEach(() => { TestBed.configureTestingModule({ providers: [ { provide: Http, useFactory: (backend, options) => { return new Http(backend, options); }, deps: [MockBackend, BaseRequestOptions] }, MockBackend, BaseRequestOptions, SomeService ] }); }); it('should get value', async(inject([SomeService, MockBackend], (service: SomeService, backend: MockBackend) => { backend.connections.subscribe((conn: MockConnection) => { const options: ResponseOptions = new ResponseOptions({body: 'hello'}); conn.mockRespond(new Response(options)); }); service.getSomething('http://dummy.com').subscribe(res => { console.log('subcription called'); expect(res).toEqual('hello'); }); }))); });
这个问题并没有真正解决了所选择的答案,这是真的只是编写测试的建议,而是在评论中,你必须点击一个链接和搜索它。 因为我有另一个问题用了同样的错误,在这里我要补充这两种解决方案。
- 解决了OP的问题:
如果你有一个这样的桶(index.ts或多导出文件):
export * from 'my.component' // using my.service via DI
export * from 'my.service'
然后,你可以得到这样一个错误EXCEPTION: Can't resolve all parameters for MyComponent: (?)
为了解决这个问题,你有组件之前导出的服务:
export * from 'my.service'
export * from 'my.component' // using my.service via DI
- 解决我的问题:
相同的错误可能发生由于circular dependency
引起的undefined
服务导入。 要检查, console.log(YourService)
导入它(在你的测试文件-在这个问题正在发生的事情)之后。 从其中两个出口索引文件导入服务( - 如果它是不确定的,你可能已经做出了index.ts文件(桶)出口无论是服务和使用它(分量/效果/无论你正在测试)的文件使其成为完整的圆)。
查找文件并导入你直接从需要的服务your.service.ts
文件,而不是指数。