testing - 在 vuetify 单元测试中让(模拟的)转换尽快在 v-menu 内完成
问题描述
当激活器被触发时,v-menu 在内部使用一个过渡来显示给定的元素。我们只是想测试菜单元素是否在激活器点击后显示。
在我们的设置中,我们使用 Vue Test Utils 进行了组件测试,并执行以下操作:
const wrapper = createWrapper(...)
expect(wrapper.contains('.my-class')).toBe(false) // the Element is not there in the beginning
clickTheTriggerElement(wrapper) // trigger v-menu to show
await wrapper.vm.$nextTick()
expect(wrapper.find('.my-class').isVisible()).toBe(true) // fails
这失败了,因为 v-menu 使用的转换尚未完成。(它会在 setTimeout(...) 之后,但这是不太可接受的)。
Vue Test Utils 将此描述为一个常见问题,并提供了一个似乎适用于普通 vue.js 转换的解决方案。(他们使用一个模拟转换来立即渲染。)不幸的是,这似乎不适用于 vuetify 的内部转换。
你会怎么处理?
解决方案
我在 v-menu 中为 v-list 编写了单元测试,但我没有模拟转换。这是我的代码:
//ACTION
const button = wrapper.find('.theme-picker');
await button.trigger('click');
const topic = wrapper.find('.v-list-item');
await topic.trigger('click');
const result = wrapper.vm.$router;
//ASSERT
expect(result).toContainEqual(expected);
如果您有一些无法“达到”的异步行为,您可以使用:
test('description', (done) => {
wrapper.vm.$nextTick(() => {
expect(result).toBe(expected);
done();
});
});
它适用于 Jest 和 Mocha。测试将等到异步代码完成。也许它会帮助某人。
推荐阅读
- sql - MS SQL Server - 如何将所有存储过程从我的机器导出到我的朋友机器?
- android - 如何监听 canGoBack() 和 canGoForward()?
- php - 如何修复更新 Google 电子表格时出现的错误
- centos7 - centos7 Cockpit 176 无法添加远程主机
- sql - 使用 SQL 插入数据
- ios - 按下听写(语音转文本)按钮时不会触发 UIKeyboardWillChangeFrameNotification
- html - CSS Margin 仅适用于 chrome
- mysql - Mysql Workbench导入数据SQL报错1142
- swift - 您可以严格通用类型或给一个参数多于一种类型吗?
- angular - stylePreprocessorOptions 不适用于@Angular/cli 7