【问题标题】:Angular unit testing - injection failing [duplicate]角度单元测试 - 注入失败[重复]
【发布时间】:2021-05-25 22:13:28
【问题描述】:

我正在尝试创建一个 Angular 单元测试,但马上就失败了。

我已经查看了thisthis 这个 SO,这似乎正是我正在努力解决的问题,但在尝试了那里提到的修复后,我仍然不正确。

这是我的代码:

import { TestBed } from '@angular/core/testing';

import { ContactsService } from './contacts.service';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { HttpClient } from '@angular/common/http';

describe('ContactsService', () => {


   beforeEach(() => {
     TestBed.configureTestingModule({
       imports: [ HttpClientTestingModule, ContactsService, HttpClient],
  })
  .compileComponents();
  });


});

当我运行一个 ng 测试时,我得到了这个错误:

NullInjectorError: R3InjectorError(DynamicTestModule)[ContactsService -> HttpClient -> HttpClient]: NullInjectorError: 没有 HttpClient 的提供者!

我的 .ts,为了完整性:

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Entry } from '../classes/entry';
import { EntrySearch } from '../classes/entrySearch';

@Injectable({
  providedIn: 'root'
})
export class ContactsService {

  constructor(private http: HttpClient) { }

}

【问题讨论】:

标签: angular unit-testing


【解决方案1】:

是的,就像 tilo 所说,它应该有效。 并尝试让你的beforeEach - async()

试试这个 - 稍微修改一下(参见声明部分):

import { TestBed } from '@angular/core/testing';

import { ContactsService } from './contacts.service';
import { HttpClientTestingModule } from '@angular/common/http/testing';

describe('ContactsService', () => {


   beforeEach(async(() => {
     TestBed.configureTestingModule({
       declarations: [ContactsService],
       imports: [ HttpClientTestingModule]
  })
  .compileComponents();
  }));


});

【讨论】:

    【解决方案2】:

    您只需要导入HttpClientTestingModule 并提供您的ContactsService

    import { ContactsService } from './contacts.service';
    import { HttpClientTestingModule } from '@angular/common/http/testing';
    import { TestBed } from '@angular/core/testing';
    
    describe('ContactsService', () => {
      beforeEach(() => TestBed.configureTestingModule({
        imports: [ HttpClientTestingModule ],
        providers: [ ContactsService ]
      }));
    
     it('should be created', () => {
        const service: ContactsService = TestBed.inject(ContactsService);
        expect(service).toBeTruthy();
       });
    });
    

    【讨论】:

    • 使用您的代码,我仍然遇到同样的错误。我是否正确假设我不必重建/重新启动 ng 测试?
    • 你必须再次运行测试,sue。
    • 是的,即使经过新的 ng 测试,我仍然收到“NullInjectorError: No provider for HttpClient!”
    • 你用我上面提供的那个替换了你的整个测试类吗?如果没有,你能提供一个最小的演示吗?
    • 是的,完全用你的替换了所有内容。我现在也将我的 ts 添加到问题中,如果它有帮助的话。
    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2018-05-03
    相关资源
    最近更新 更多