【问题标题】:this.ProductDataService.getAllProducts is not a function using jasmine-karmathis.ProductDataService.getAllProducts 不是使用 jasmine-karma 的函数
【发布时间】:2019-12-31 14:00:03
【问题描述】:

我正在 angular7 中运行单元测试用例,即 jasmine-karma。我收到了这个错误 -

ProjectManagementComponent 应该使用服务中的 ProjectList

TypeError: this.ProjectManagementService.getProject 不是函数

如果我使用 useClass 而不是 useValue ,则会出现错误 -

[object ErrorEvent] 抛出

我尝试了多种选择,但无法通过互联网找到答案。

app.component.spec.ts

describe('ProjectManagementComponent', () => {
  let comp: ProjectManagementComponent;
  let fixture: ComponentFixture<ProjectManagementComponent>;
  let de: DebugElement;
  let el: HTMLElement;

beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ProjectManagementComponent],
      imports: [HttpClientModule, RouterTestingModule, RouterModule, NgbModule, NgxPaginationModule, FormsModule, ReactiveFormsModule, BrowserModule,],
      providers: [{ provide: ProjectManagementService, useClass: ProjectManagementService },
               {provide: ProductsService, useClass: ProductsService}]
    })
      .compileComponents().then(() => {
        fixture = TestBed.createComponent(ProjectManagementComponent);
        comp = fixture.componentInstance;
       de = fixture.debugElement.query(By.css('form[id=addProjectCreationData]'))
        el =de.nativeElement;
      });
  }));


it("should use the ProjectList from the service", () => {
    console.log("Create a Project Service")
    const projectService = fixture.debugElement.injector.get(ProjectManagementService);
    fixture.detectChanges();
    expect(projectService.getProject()).toEqual(comp.getResponse);
  });
});

app.component.service.stub.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { map } from 'rxjs/operators';
import { config } from "config";
const baseUrl: string = config.url;


@Injectable()
export class ProjectManagementServiceStub {
    constructor(private http: HttpClient) { }
              
    getProject(url) :Observable<any>{
        
        return this.http.get(url )
            .pipe(map(Response => Response))
                
    }

}

【问题讨论】:

  • 我在你的组件代码中看不到getProject(),它什么时候被调用?
  • 另外,使用useClass时不需要const projectService = fixture.debugElement.injector.get(ProjectManagementService);
  • 谢谢。请检查这个 -stackoverflow.com/questions/57690695/…
  • @Shashank。我更正了我的代码。我把正确的服务调用 getProject()。

标签: angular typescript jasmine karma-jasmine


【解决方案1】:

更正您的 providers 部分,因为您没有使用您创建的 stub ( ProjectManagementServiceStub )

 providers: [{ provide: ProjectManagementService, useClass: ProjectManagementServiceStub },
             {provide: ProductsService, useClass: ProductsService}] // <--- FIX  this as well, you need to inject "stub"

附注:it 块下方似乎没有意义。

it("should use the ProjectList from the service", () => {
    console.log("Create a Project Service")
    const projectService = fixture.debugElement.injector.get(ProjectManagementService);
    fixture.detectChanges();
    expect(projectService.getProject()).toEqual(comp.getResponse);
  });
});

这缺少单元测试的本质,因为您正在测试属于serviceprojectService.getProject()不是 这个component

【讨论】:

  • 我收到此错误 - StaticInjectorError(Platform: core)[ProjectManagementComponent -> ProjectManagementServiceStub]: NullInjectorError: No provider for ProjectManagementServiceStub!错误:StaticInjectorError(DynamicTestModule)[ProjectManagementComponent -> ProjectManagementServiceStub]:
  • @Techdive : 请从export class ProjectManagementServiceStub 中删除@Injectable()
猜你喜欢
  • 2017-04-17
  • 2015-12-06
  • 2017-01-14
  • 2017-08-31
  • 2017-04-27
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多