【问题标题】:Angular test failure when I make http call当我进行 http 调用时,角度测试失败
【发布时间】:2020-02-21 22:12:07
【问题描述】:

这是我的 dashboard.component.ts 文件:

import { Post } from "./../models/post";
import { Component, OnInit } from "@angular/core";

@Component({
  selector: "app-dashboard",
  templateUrl: "./dashboard.component.html",
  styleUrls: ["./dashboard.component.css"]
})
export class DashboardComponent implements OnInit {
  constructor() {}

  title: string = "Hello World!";
  posts: Post[] = [];

  addNumber(a: number, b: number) {
    return a + b;
  }

  ngOnInit() {
  }
}

这是我的 dashboard.component.spec.ts 文件:

import { async, ComponentFixture, TestBed } from "@angular/core/testing";

import { DashboardComponent } from "./dashboard.component";

describe("DashboardComponent", () => {
  let component: DashboardComponent;
  let fixture: ComponentFixture<DashboardComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [DashboardComponent]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(DashboardComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it("should add two numbers", () => {
    expect(component.addNumber(1, 1)).toBe(2);
  });

  it("title should contain the word Hello", () => {
    expect(component.title).toContain("Hello");
  });
});

一切正常,两个测试都成功了。 但是当我想像这样使用我的服务添加 http 调用时:

添加http调用后的dashboard.component.ts文件:

import { Post } from "./../models/post";
import { PostService } from "./../services/posts-api.service";
import { Component, OnInit } from "@angular/core";

@Component({
  selector: "app-dashboard",
  templateUrl: "./dashboard.component.html",
  styleUrls: ["./dashboard.component.css"]
})
export class DashboardComponent implements OnInit {
  constructor(private postService: PostService) {}

  title: string = "Hello World!";
  posts: Post[] = [];

  addNumber(a: number, b: number) {
    return a + b;
  }

  ngOnInit() {
    this.postService.getPosts().subscribe(posts => {
      this.posts = posts;
    });
  }
}

http调用成功,现在测试失败,为什么?没有变化的规范文件:

NullInjectorError: StaticInjectorError(DynamicTestModule)[HttpClient]: StaticInjectorError(平台:核心)[HttpClient]: NullInjectorError: 没有 HttpClient 的提供者!

谢谢。

【问题讨论】:

    标签: angular karma-jasmine


    【解决方案1】:

    您不需要将 HttpClientTestingModule 添加到您的规范文件中,因为您使用 HttpCient 本身注入 PostService:

    import {HttpClientTestingModule} from "@angular/common/http/testing";
    
    beforeEach(async(() => {
        TestBed.configureTestingModule({
          declarations: [DashboardComponent],
          imports: [HttpClientTestingModule]
        }).compileComponents();
      }));
    

    【讨论】:

    • 为什么?但我根本不想测试服务。
    • 由于 PostService 是组件构造函数的一部分,您需要解析它以使组件正常工作。但是为了让你的 PostService 也能正常工作,你也需要关心它自己的构造函数,其中包含 HttpClient 。这就是为什么最后,您的测试需要包含 HttpClientTestingModule。
    • 好的,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2021-09-18
    • 2018-05-03
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多