【发布时间】:2019-12-22 22:05:42
【问题描述】:
我的项目是用vue-cordova-webpack template 构建的。我创建了一个 vue 组件。我的组件模板中有v-ons-input。我需要在组件的单元测试期间更改v-ons-input 的值。我只能在编译ons-input 之后才能做到这一点,因为只有在编译ons-input 之后才有input 内部(参见OnsenUI component compilation)。问题是编译是异步执行的,当 OnsenUI 组件准备好使用时,我没有找到任何“合法”的方法来捕获事件。
我该怎么办?我为ons-input 的内部方法_compile 创建了一个sinon spy,并等到它被调用:
it('test', (done) => {
const wrapper = mount(myVueComponent)
// here I can't set a value for ons-input
var spy = sinon.spy(wrapper.find('ons-input').element, '_compile')
function waitForCall(spy) {
return new Promise(function (resolve, reject) {
(function wait() {
if (spy.called) {
return resolve()
}
setTimeout(wait, 10)
})()
})
}
waitForCall(spy).then(function () {
// now ons-input is compiled and I can set a value for ons-input
wrapper.find('ons-input').element.value = 'foo'
...
}).then(done, done)
})
是否有更“干净”的方法来确定 OnsenUI 组件已准备好在单元测试中使用(无需使用组件的内部方法进行操作)?
附:我知道不适用于测试环境的方法 - 为document(参见here)监听init 事件,但它在单元测试中不起作用。
【问题讨论】:
-
根据the docs
v-ons-input应该与普通的input标签几乎完全相同。在这种情况下,我认为你应该把它存起来,因为你应该测试 your 组件,而不是v-ons-input。
标签: javascript unit-testing vue.js onsen-ui