【问题标题】:How to create an AlertController mock in Ionic如何在 Ionic 中创建 AlertController 模拟
【发布时间】:2018-05-28 22:15:40
【问题描述】:

我正在使用 Jasmine 测试我的 Ionic 3 应用程序,我想知道如何模拟创建确认警报的 AlertController

创建确认警报的函数如下:

pressedButton:string="";
myAlert() {
    let confirm = this.alerCtrl.create({
        title: 'Title',
        message: 'Some message here',
        buttons: [
        {
            text: 'No',
            handler: () => {
                this.pressedButton = 'No';
            }
        },
        {
            text: 'Yes',
            handler: () => {
                this.pressedButton = 'Yes';
            }
        }]
    });
    confirm.present()
}

基本上,我想要为AlertController 创建一个模拟,例如,模拟用户按下“是”按钮,以便我可以测试“是”按钮处理程序中的代码。按照我的单元测试。

beforeEach(() => {
    fixture = TestBed.createComponent(MyPage);
    comp = fixture.componentInstance;
});

it('should set pressedButton to "Yes" when the user press the "Yes" button', () => {
    comp.myAlert(); //I want a mock that simulates the Yes button being pressed
    expect(comp.pressedButton).toEqual('Yes');
});

我查看了 ionic3-mocks(下面的链接),但我不知道如何在警报中强制按钮操作。 https://www.npmjs.com/package/ionic3-mocks

【问题讨论】:

    标签: unit-testing ionic-framework jasmine ionic3


    【解决方案1】:

    我正在使用 Ionic 4(以前是 3),添加新的模拟似乎对我来说也很麻烦。使用AlertController,您可以在我之前的评论中找到有用的信息:https://stackoverflow.com/a/59193696/1594579

    【讨论】:

    • 这不是答案,更像是评论。
    【解决方案2】:

    我对 ionic 并不完全熟悉,但归根结底,这只是 JavaScript 和 HTML。您需要做的是抓取与您要单击的按钮对应的 DOM 元素,然后调用 click 方法。

    以下是可行的方法。

    为所有警报控制器按钮添加 ID,如下所示:

    let confirm = this.alerCtrl.create({
        title: 'Title',
        message: 'Some message here',
        buttons: [
        {
            text: 'No',
            handler: () => {
                this.pressedButton = 'No';
            },
            id: 'no-alert'
        },
        {
            text: 'Yes',
            handler: () => {
                this.pressedButton = 'Yes';
            },
            id: 'yes-alert'
        }]
    });
    confirm.present()
    

    然后在你的测试中,抓取按钮元素:

    let yesButton = document.getElementById('yes-alert');
    yesButton.click();
    ...continue the test...
    

    更新最好测试控制器本身并确保所有操作都正确连接,但如果这不可能,您可以直接测试处理程序代码。

    这样的事情会起作用:

    export const yesHandler = () => ...
    export const noHandler = () => ...
    
    pressedButton:string="";
    myAlert() {
        let confirm = this.alerCtrl.create({
            title: 'Title',
            message: 'Some message here',
            buttons: [
            {
                text: 'No',
                handler: noHandler
            },
            {
                text: 'Yes',
                handler: yesHandler
            }]
        });
        confirm.present()
    }
    

    然后您可以直接在测试中测试这些处理程序。

    【讨论】:

    • 如果我可以使用原始的 AlertController,您的建议会起作用。但是,当我尝试使用原始控制器时,我得到了这个问题中所述的错误:[stackoverflow.com/questions/40781394/…这就是我需要创建模拟的原因
    • 如果你不是在测试实际的控制器,而只是在控制器内部的代码,为什么不直接调用那个代码呢?我会更新我的答案。
    • 无法在按钮对象中添加 id
    猜你喜欢
    • 1970-01-01
    • 2018-03-06
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2017-04-07
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多