【问题标题】:How to check whether the binding worked in ExtJS 6? (testing)如何检查绑定是否在 ExtJS 6 中有效? (测试)
【发布时间】:2020-04-03 16:19:55
【问题描述】:

我想自动化一些与 ExtJS 6.7 应用程序上的数据绑定相关的测试。 我可以在“完整应用程序”中看到绑定完美地工作(显然在测试中也可以从屏幕截图中看到),但我为了自动化测试我不知道我可以听哪些事件。

绑定过程显然是异步的,我需要在检查值之前“等待”它完成,但我在 Sencha 文档中找不到任何内容。

实际上,我需要一个挂钩到某个状态,在该状态下我可以“假设”绑定已完成,因为出于测试目的,我还想涵盖绑定未完成的情况(即字段名称中的拼写错误) , 绑定的 json 结构的变化等)。

查看截图下方的代码,提前致谢!

viewController.js:

Ext.define('Pms.view.test.viewController',
    {
        extend: 'Ext.app.ViewController',
        xtype: 'controller.controller'
    });

viewModel.js:

Ext.define('Pms.view.test.viewModel',
{
    extend: 'Ext.app.ViewModel',
    data: {
        windowTitle: 'Title bound!'
    }
});

form.js:

Ext.define('Pms.view.test.form',
{
    extend: 'Ext.window.Window',
    requires: ['Pms.view.test.viewController','Pms.view.test.viewModel'],
    controller: 'controller',
    viewModel: { type: 'Pms.view.test.viewModel' },
    bind: {
        title: '{windowTitle}'
    }
});

form.spec.js:

Ext.Loader.syncRequire([
    'Pms.view.test.form',
    'Pms.view.test.viewModel'
]);

describe('Pms.view.test.form', function() {
    it('Bound',
        function() {
            var w = Ext.create('Pms.view.test.form');
            w.setViewModel(Ext.create('Pms.view.test.viewModel'));
            w.show();
            // the following line is expected to be run in the asynchronous hook I'm looking for
            expect(w.title).to.be('Title bound!');
        });
});

【问题讨论】:

    标签: extjs mocha.js extjs6 extjs6-classic karma-mocha


    【解决方案1】:

    简短的回答是: vm.notify();

    详细的分析器是:

    it('Bound',
        function() {
            let form = Ext.create('Pms.view.test.Form'),
                vm = form.getViewModel();
    
            // form.show(); ==> replaced by autoShow: true
            vm.notify();
    
            expect(form.getTitle()).to.be('Title bound!');
        }
    );
    

    奖金信息: 您的代码可以改进:

    • 文件名始终使用大写字母(例如Form.js ==> Pms.view.test.Form
    • 您可以使用autoShow 配置来代替form.show()
    • 对视图、viewController 和 viewModel 使用相同的 alias(此处为:test-form
    • 将工作 controller 视为保留字,不要用作控制器的名称
    • 为您的 viewModel 命名 ==> 别名:viewmodel.test-form,

    查看:

    Ext.define('Pms.view.test.Form', {
        extend: 'Ext.window.Window',
        xtype: 'test-form',
    
        requires: [
            'Pms.view.test.FormController',
            'Pms.view.test.FormModel'
        ],
    
        controller: 'test-form',
        viewModel: { type: 'test-form' },
    
        autoShow: true,
        bind: {title: '{windowTitle}'}
    });
    

    控制器:

    Ext.define('Pms.view.test.FormController', {
        extend: 'Ext.app.ViewController',
        alias : 'controller.test-form'
    });
    

    视图模型:

    Ext.define('Pms.view.test.FormModel', {
        extend: 'Ext.app.ViewModel',
        alias: 'viewModel.test-form',
    
        data: {
            windowTitle: 'Title bound!'
        }
    });
    

    【讨论】:

    • 太好了,感谢您的提示!回复:非常感谢您的建议,我的“真实”代码几乎与您建议的一样,我发布的代码是我设置的快速示例,以更简单的形式重现问题,我可以发布到 stackoverflow!非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    相关资源
    最近更新 更多