茉莉花测试,未捕获“ <方法>不是函数”错误

时间:2019-08-09 16:42:16

标签: angular jasmine

在我的Angular 7组件中,ngOnInit在服务上调用方法(getRecurrence)。为了进行测试,我在模拟服务,但是模拟缺少该方法。 (因此,组件代码是正确的,但是测试模拟是错误的)

组件源代码段:

async ngOnInit() {
  try {
    var results = await Promise.all([
      this.lookupService.getRecurrence(),
      ...
    }
  }

运行测试时,我在日志文件中收到预期的错误消息TypeError: this.lookupService.getRecurrence is not a function,但是Jasmine和Karma报告测试已通过。

已编辑:茉莉花测试是从ng g c ...创建的标准测试。

beforeEach(async(() => {
  TestBed.configureTestingModule({
    declarations: [MyComponent],
    imports: [ReactiveFormsModule, BrowserAnimationsModule, FormsModule],
    providers: [
      { provide: LookupService, useClass: MockLookupService }
    ]
  })
  .compileComponents();
}));

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

it('should create', () => {
  expect(component).toBeTruthy();
});

由于ngOnInit是异步的,因此我尝试将async()fakeAsync()添加到用于创建组件的beforeEach和用于验证该组件的测试用例中,有用。

关于如何让Jasmine和Karma捕获错误并报告失败的任何建议?

编辑:我执行了Bill Cheng的建议,但还是没有运气。我在测试中添加了控制台日志消息(并将await Promise.all()替换为await this.lookupService.getRecurrence()),这就是我得到的。

ngOnInit源代码片段:

async ngOnInit() {
  console.log('ngOnInit')
  try {
    console.log('Before getRecurrence')
    this.recurrences = await this.lookupService.getRecurrence();
    console.log('After getRecurrence')
    ...
  }
}

测试代码:

it('should create', async() => {
  fixture.detectChanges();
  console.log('should create before whenStable')
  await fixture.whenStable();
  console.log('should create after whenStable')
  expect(component).toBeTruthy();
});

控制台日志结果:

ngOnInit
context.js:245 Before getRecurrence
context.js:245 TypeError: this.lookupService.getRecurrence is not a function
    [stack trace deleted]
context.js:245 should create before whenStable
context.js:245 should create after whenStable

在我看来,正在处理和食用TypeError的某个地方,所以就茉莉花而言,没有例外...

1 个答案:

答案 0 :(得分:1)

答案正盯着我,我只需要发布更多代码。

async ngOnInit() {
  try {
    ...
  }
  catch (err) {
    console.log(err);
  }
}

我正在处理错误,以便单元测试无法看到它。 /.\