【问题标题】:ionic 5 unit test with popover controller带有弹出控制器的 ionic 5 单元测试
【发布时间】:2021-06-10 10:32:29
【问题描述】:

我试图在我的 ionic 5 / angular 11 项目中监视 popover present 方法,但出现错误

未处理的承诺拒绝:无法读取未定义的属性“then”

这是单元测试代码

describe('LoginPage', () => {

 let popoverSpy = jasmine.createSpyObj('Popover', ['create', 'present', 'onDidDismiss', 'dismiss']);
 let popoverCtrlSpy = jasmine.createSpyObj('PopoverController', ['create']);
 popoverCtrlSpy.create.and.callFake(function () {
  return popoverSpy;
 });

 beforeEach(waitForAsync(() => {
  TestBed.configureTestingModule({
   declarations: [LoginPage],
   imports: [
     IonicModule.forRoot(),
     TranslateModule.forChild(),
     ComponentsModule,
     TranslateModule.forRoot({
       loader: { provide: TranslateLoader, useClass: TranslateFakeLoader }
     })
   ],
   providers: [{ provide: PopoverController, useValue: popoverCtrlSpy }]
 }).compileComponents()

 it("check popover preset", () => {
  component.openEntitySelection();
  fixture.detectChanges();
  expect(popoverSpy.present).toHaveBeenCalled()
 })

}


private async openEntitySelection() {

 let popover = await this.popoverCtrl.create({
  component: PopoverPage
 });
 await popover.present();
 popover.onDidDismiss().then((response) => {
  //Handle response
 })

}

提前致谢!

【问题讨论】:

    标签: unit-testing jasmine karma-jasmine ionic5 angular11


    【解决方案1】:

    看来你不是在嘲笑onDidDismiss 来返回一个承诺。在进行断言之前,您还需要使用 fixture.whenStablewaitForAsync 实用程序来等待承诺得到解决。

    试试这个:

    describe('LoginPage', () => {
    
     let popoverSpy = jasmine.createSpyObj('Popover', ['create', 'present', 'onDidDismiss', 'dismiss']);
     // !! -- Add this line -- !!
     // I am mock resolving it to a value of true, you can resolve it to any value
     popOverSpy.onDidDismiss.and.returnValue(Promise.resolve(true));
     // !! --- !!
     let popoverCtrlSpy = jasmine.createSpyObj('PopoverController', ['create']);
     popoverCtrlSpy.create.and.callFake(function () {
      return popoverSpy;
     });
    
     beforeEach(waitForAsync(() => {
      TestBed.configureTestingModule({
       declarations: [LoginPage],
       imports: [
         IonicModule.forRoot(),
         TranslateModule.forChild(),
         ComponentsModule,
         TranslateModule.forRoot({
           loader: { provide: TranslateLoader, useClass: TranslateFakeLoader }
         })
       ],
       providers: [{ provide: PopoverController, useValue: popoverCtrlSpy }]
     }).compileComponents()
    
     it("check popover preset", (done) => { // add done to let jasmine know you're done
      component.openEntitySelection();
      fixture.detectChanges();
      // you have to wait at least for one fixture.whenStable I am thinking
      // because we are returning a promise and we have to ensure that the promises
      // have completed before doing our assertion.
      fixture.whenStable().then(() => {
         expect(popoverSpy.present).toHaveBeenCalled();
         done();
      });
     });
    }
    
    
    private async openEntitySelection() {
    
     let popover = await this.popoverCtrl.create({
      component: PopoverPage
     });
     await popover.present();
     popover.onDidDismiss().then((response) => {
      //Handle response
     })
    
    }
    

    【讨论】:

    • 我得到:'无法读取未定义的属性'存在''。间谍中的“Popover”是什么?
    • 你的代码中可能有一个.present,在它的左边,那个对象是未定义的。所以很可能你没有正确设置jasmine.createSpyObj
    猜你喜欢
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2016-07-25
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多