对vue项目(增加/进行)单元测试,所遇到的问题及解决方法。 dom节点为null等

1、用vue-cli生成一个新的项目,把单元测试需要的文件直接复制到你现有的项目中

2.增加启动入口

"unit": "karma start test/unit/karma.conf.js --single-run"

3.安装单元测试需要的插件

npm i -D karma karma-webpack phantomjs-prebuilt karma-phantomjs-launcher karma-phantomjs-shim karma-chrome-launcher karma-sourcemap-loader mocha karma-mocha sinon chai sinon-chai karma-sinon-chai karma-spec-reporter karma-coverage

 

4.复制vue-cli生成helloWorld.vue文件到现有项目

执行 npm run unit 

这是测试通过的截图。

 

采坑1、 网上找到解决方法

### 实现方法Vue 3 中,可以利用 `ref` 来获取 DOM 元素,并将其作为参数传递给函数。具体而言,在模板中使用 `ref` 属性标记目标元素,之后可以通过组合 API 或选项 API 获取该元素并传入自定义函数。 #### 使用组合 API 和 `setup` 当采用组合 API 编写组件时,可以在 `<script setup>` 或者普通的 `<script>` 标签内声明响应式的引用对象。一旦页面完成首次渲染周期后,即可安全地访问实际的 DOM 节点[^1]。 ```vue <template> <div @click="handleClick">点击这里</div> </template> <script setup> import { ref, onMounted } from 'vue'; const myDivRef = ref(null); function handleClick(event) { console.log('当前点击的DOM节点:', event.currentTarget); doSomethingWithElement(myDivRef.value); // 将DOM节点作为参数传递给其他函数 } // 假设这是另一个处理DOM的操作函数 function doSomethingWithElement(element) { if (element) { element.style.backgroundColor = "lightblue"; } } </script> ``` 上述代码片段展示了如何通过事件处理器中的 `event.currentTarget` 获取触发事件的具体 DOM 元素,并且也演示了怎样借助 `ref` 定义好的变量名 `.value` 属性取得对应的 DOM 参考。 #### 动态创建组件场景下的应用 对于动态加载或条件渲染的情况下,可能需要更复杂的逻辑来确保正确的时间点拿到 DOM 节点再执行相应操作。此时除了基本的 `ref` 处理外,还需要考虑生命周期钩子如 `onMounted()` 确认时机合适后再做进一步动作[^4]。 ```javascript import { createApp, h, ref, onMounted } from 'vue'; import MyComponent from './MyComponent.vue'; let appContainer = document.getElementById('app'); if (!appContainer) throw new Error("未找到挂载点"); const componentInstance = ref(); const mountDynamicComponent = () => { const vnode = h(MyComponent, {}, null); const mountedApp = createApp({ setup() { onMounted(() => { setTimeout(() => { // 这里假设有一个延迟后的操作依赖于真实的DOM存在 manipulateDom(componentInstance.value.$el); }, 0); return {}; }); return { componentInstance }; }, template: '<component :is="vnode" ref="componentInstance"></component>' }); mountedApp.mount(appContainer); }; function manipulateDom(domEl) { domEl && domEl.classList.add('highlight'); // 修改样式或其他交互行为 } ``` 这段例子说明了在一个异步流程下(比如按需加载组件),仍然能够可靠地捕获到最终呈现出来的 DOM 结构,并对其进行必要的修改或增强。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值