测试 - 无法解决所有参数(类名)测试 - 无法解决所有参数(类名)(Testing - Can&#

2019-05-12 02:08发布

上下文

我创建了一个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.tsApiConnectorService “从我的加载测试小号规范文件), ApiService的测试一定会成功。
  • 如果我删除api-service.spec.tsApiService “从我的加载测试小号规范文件), ApiConnectorService的测试一定会成功。

为什么我有这样的错误? 这似乎是我的两个文件的背景是冲突的,我不知道为什么,以及如何解决这个问题。

Answer 1:

这是因为Http服务不能从解决HttpModule ,在测试环境中。 它是依赖于平台的浏览器。 你甚至不应该试图在测试过程中,以使XHR调用反正。

为此,角度提供了MockBackendHttp使用的服务。 我们用这个模拟后端订阅连接在我们的测试,并在每个连接时,我们可以嘲笑的响应。

这里是你可以关闭的工作很短的完整的例子

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



Answer 2:

这个问题并没有真正解决了所选择的答案,这是真的只是编写测试的建议,而是在评论中,你必须点击一个链接和搜索它。 因为我有另一个问题用了同样的错误,在这里我要补充这两种解决方案。

  1. 解决了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
  1. 解决我的问题:

相同的错误可能发生由于circular dependency引起的undefined服务导入。 要检查, console.log(YourService)导入它(在你的测试文件-在这个问题正在发生的事情)之后。 从其中两个出口索引文件导入服务( - 如果它是不确定的,你可能已经做出了index.ts文件(桶)出口无论是服务和使用它(分量/效果/无论你正在测试)的文件使其成为完整的圆)。

查找文件并导入你直接从需要的服务your.service.ts文件,而不是指数。



文章来源: Testing - Can't resolve all parameters for (ClassName)