【问题标题】:Unit testing - Getting issue with Alert Controller in Ionic Framework单元测试 - 离子框架中的警报控制器出现问题
【发布时间】:2019-12-19 12:48:45
【问题描述】:

我正在尝试为已调用或未调用的方法编写测试用例。在该方法中,我调用了一个警报确认框。

我收到类似

的错误

失败:this.alertCtrl.create 不是函数

组件.ts
submitTicket(comments) {
if (comments.length > 0) {
  const prompt = this.alertCtrl.create({
    title: "<span>  Improve Solution  </span>",
    message: "<span>" + 'Are you sure you want  <br>' + "</span>" +
      "<span>" + 'to submit this improvement' + "</span>",
    enableBackdropDismiss: false,
    buttons: [
      {
        text: 'Cancel',
        handler: data => {
          // Some stuff
        }            
      },
      {
        text: 'Improve Solution',
        handler: data => {
         //Some stuff
        }
      }
    ]
  });
  prompt.present();
} else {
  this.errorMsg = true;
}
}
组件.spec.ts
import {AlertControllerMock } from 'ionic-mocks';

beforeEach(async(()=> {
TestBed.configureTestingModule({
    declarations: [ImprovedsolutionsPage],
    imports: [
        IonicModule.forRoot(ImprovedsolutionsPage),
        HttpClientTestingModule
    ],
    providers: [
        NavController,
        AppService,
        AlertController,
        ImprovedsolutionsPage,
        {provide: ViewController, useClass: ViewControllerMock},
        {provide: LoadingController, useClass: LoadingControllerMock},
        {provide: AlertController, useClass: AlertControllerMock},          
    ]
}).compileComponents
}))
beforeEach(()=> {
    fixture=TestBed.createComponent(ImprovedsolutionsPage)
    component=fixture.componentInstance
   fixture.detectChanges()
})

it('should be call submitTicket method', async(()= > {
spyOn(component, 'submitTicket').and.callThrough()

let comment='Needs to improve in detailing '
component.submitTicket(comment)
expect(component.submitTicket).toHaveBeenCalled()

}))

这里我使用 ionic-mocks 模块并导入了 AlertControllerMock,如上面的代码所示。我使用的是 ionic 版本 3。为了测试,我使用的是 Karma 和 jasmine

有人可以帮我解决这个问题。

【问题讨论】:

    标签: ionic-framework jasmine karma-runner


    【解决方案1】:

    [更新]这是我的提示:我无法检查您的模拟实现。但是,请确保您有一个单独的布尔变量来证明模拟函数(例如 create)是否在其他地方被调用。

    create(opts?: AlertOptions): Promise<HTMLIonAlertElement> {
            this.createAlertCalled = true;
            this.opts = opts;
    
            const self = this;
            return Promise.resolve(<HTMLIonAlertElement>{
                present: (): Promise<void> => {
                    self.presentCalled = true;
                    return Promise.resolve();
                }
            });
        }
    

    随后,对提到的变量执行spyOnAlertControllerMock,并期望断言是真实的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 2013-05-28
      • 2021-09-20
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多