Angular 4 错误:没有 HttpClient 的提供者

问题描述 投票:0回答:6

我正在使用 CLI 启动一个新的 Angular 项目,但遇到了

HttpClient
错误的无提供程序。

我已将

HttpClientModule
添加到我的模块导入中,这似乎是这种情况下的常见罪魁祸首。除此之外,在网上找不到太多信息,所以我不确定问题可能是什么。

我的app.module.ts

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

和我的服务

@Injectable()
export class FlexSearchService {


    constructor(private http: HttpClient) {}

    getSavedSearchResult(index: string, queryName: string, query: string ): Observable<any> {
      const url = `${environment.flexUrl}/${index}/search`;
      const item = new SearchQuery({queryName: queryName, variables: {q: query}});
      return this.http.post(url, item);
    }
}

ng 版本给出以下输出

@angular/cli: 1.4.2
node: 6.9.4
os: darwin x64
@angular/animations: 4.4.4
@angular/common: 4.4.4
@angular/compiler: 4.4.4
@angular/core: 4.4.4
@angular/forms: 4.4.4
@angular/http: 4.4.4
@angular/platform-browser: 4.4.4
@angular/platform-browser-dynamic: 4.4.4
@angular/router: 4.4.4
@angular/cli: 1.4.2
@angular/compiler-cli: 4.4.4
@angular/language-service: 4.4.4
typescript: 2.3.4

我的 tsconfig

{
  "compileOnSave": false,
  "compilerOptions": {
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2017",
      "dom"
    ]
  }
}

我的测试

import { TestBed, inject } from '@angular/core/testing';
import { HttpClientModule } from '@angular/common/http';
import { FlexSearchService } from './flex-search.service';

describe('FlexSearchService', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [FlexSearchService, HttpClientModule]
    });
  });
  it('should be created', inject([FlexSearchService], (service: FlexSearchService) => {
    expect(service).toBeTruthy();
  }));

非常感谢任何帮助!

angular angular-httpclient
6个回答
140
投票

在你的测试中

TestBed.configureTestingModule({
      providers: [FlexSearchService, HttpClientModule]
    });

应该是

TestBed.configureTestingModule({
      imports: [HttpClientModule],
      providers: [FlexSearchService]
    });

甚至更好(如果你想模拟请求):

TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [FlexSearchService]
    });

34
投票

导入 HttpClientTestingModule。

在您的测试中:

import { HttpClientTestingModule } from '@angular/common/http/testing';

并在测试的configureTestingModule中执行以下操作:

TestBed.configureTestingModule({
    imports: [ HttpClientTestingModule ],
})
.compileComponents();

12
投票

更简单的方法是全局提供它......将以下内容导入到 app.module.ts 中,如下所示:

import { HttpModule } from '@angular/http'
import { HttpClient, HttpClientModule } from '@angular/common/http';

并在进口中申报:

  imports: [
    HttpModule,
    HttpClientModule, ...
]

9
投票

为此,您必须导入以下内容:

import { HttpClientTestingModule } from '@angular/common/http/testing';

对于测试的

configureTestingModule
中的规范文件,请执行以下操作:

TestBed.configureTestingModule({
    imports: [ HttpClientTestingModule ],
})
.compileComponents();

1
投票

当我尝试使用 npm 链接在项目中本地链接我的角度库时,我注意到了这个问题。

从存储库下载库解决了我的问题。


0
投票

对于任何在升级 Angular 版本后来到这里并发现

HttpClientTestingModule
已弃用的人,您可以使用
provideHttpClient()
provideHttpClientTesting()
代替。

        providers: [
            provideHttpClient(),
            provideHttpClientTesting(),
   
        ]
© www.soinside.com 2019 - 2024. All rights reserved.