我想自动化一些与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!');
});
});
简短的答案是: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
)form.show()
,您可以使用autoShow
配置alias
(在这里:test-form
)controller
处理为保留字,请勿将其用作控制器的名称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'
});
viewModel:
Ext.define('Pms.view.test.FormModel', {
extend: 'Ext.app.ViewModel',
alias: 'viewModel.test-form',
data: {
windowTitle: 'Title bound!'
}
});