【问题标题】:Expected spy<method_name> to have been called once.It is called 0 times预期 spy<method_name> 已被调用一次。它被调用 0 次
【发布时间】:2020-09-15 18:45:10
【问题描述】:

我是 Jasmine 的新手。我正在编写一个 UT 来检查是否在 ngAfterViewInit 函数中调用了服务。

下面是我的测试代码

describe('HomePage', () => {
  let component: HomePage;
  let fixture: ComponentFixture<HomePage>;
  let service:DataloadService;
  let srvSpy:any;
  let compoSpy:any;
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ HomePage ],
      imports: [
        HttpClientTestingModule,
        IonicModule.forRoot()]
    }).compileComponents();

    fixture = TestBed.createComponent(HomePage);
    component = fixture.componentInstance;
  }));
   it('getData method should be called on Init',()=>{
      srvSpy=jasmine.createSpy('getData').and.callThrough();  
      expect(srvSpy).not.toHaveBeenCalled();
      component.ngAfterViewInit();
      expect(srvSpy).toHaveBeenCalledTimes(1);

  });

});

每次我运行脚本时,测试都会失败并给出错误提示

预计间谍已被调用一次。它被调用了 0 次

我应该如何解决这个问题?

更新:

import { Component, OnInit, AfterViewInit } from '@angular/core';
import { from } from 'rxjs';
import {DataloadService} from '../services/dataload.service';
@Component({
  selector: 'app-home',
  templateUrl: 'home.page.html',
  styleUrls: ['home.page.scss'],
})
export class HomePage implements AfterViewInit {
  value:any;
  constructor(private srv:DataloadService) {}
  ngAfterViewInit(){
    this.srv.getData().subscribe(
      res=>{
        this.value=res;
        console.log(this.value);
      }
    )
  }
}

【问题讨论】:

  • 让我们看看你的ngAfterViewInit 代码。乍一看,您似乎没有正确地进行间谍活动。
  • 我已经用 ngAfterViewInit 更新了我的代码
  • 先做fixture.detectChanges()再做fixture.whenStable,里面有你的期望。

标签: angular unit-testing jasmine karma-jasmine karma-runner


【解决方案1】:

尝试做这样的事情。

我很惊讶 Angular 测试平台没有抱怨,因为您没有注入 DataloadService

import { of } from 'rxjs';
.....
describe('HomePage', () => {
  let component: HomePage;
  let fixture: ComponentFixture<HomePage>;
  let service:DataloadService;
  let mockDataLoadService = jasmine.createSpyObj('srv', ['getData']); // add this line to mock the dataLoadService with public method of getData
  let srvSpy:any;
  let compoSpy:any;
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ HomePage ],
      imports: [
        HttpClientTestingModule,
        IonicModule.forRoot()],
      // stub out the real implementation of DateLoadService with our mock
      providers: [{ provide: DataLoadService, useValue: mockDataLoadService }],
    }).compileComponents();

    // make getData return Observable of 'hello world', it is up to you what you would like to return
    mockDataService.getData.and.returnValue(of('hello world'));
    fixture = TestBed.createComponent(HomePage);
    component = fixture.componentInstance;
  }));
   // change the title of the test
   it('value should be changed on ngAfterViewInit', ()=>{
      component.ngAfterViewInit();
      expect(component.value).toBe('hello world'); // assert that it went inside of the subscribe block and made component.value to 'hello world'

  });

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-05
    • 2018-11-14
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多