角度单元测试 - 注入失败[重复]

Posted

技术标签:

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

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

我已经查看了this 和 this 这个 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)  


【问题讨论】:

这个关于重复目标的答案完美回答:***.com/a/47261579/5468463 【参考方案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 添加到问题中,如果它有帮助的话。

以上是关于角度单元测试 - 注入失败[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Junit单元测试自动注入失败

由于构造函数中的组件,角度单元测试失败。

Vue 路由器的注入在 Je​​st 单元测试期间失败

对于单元测试中没有构造函数的扩展类,Angular 10 依赖注入失败

角度单元测试:失败:模块“DynamicTestModule”导入的意外值“DxTemplateHost”:添加@NgModule 注释

单元测试怎么注入service