Repository: Tencent/tdesign-mobile-vue
Pull request #750 (2023-05-30 16:00:20)

test(PullDownRefresh): add test case
<!--
首先，感谢你的贡献！😄
请阅读并遵循 [TDesign 贡献指南](https://github.com/Tencent/tdesign/blob/main/docs/contributing.md)，填写以下 pull request 的信息。
PR 在维护者审核通过后会合并，谢谢！
-->

### 🤔 这个 PR 的性质是？

- [ ] 日常 bug 修复
- [ ] 新特性提交
- [ ] 文档改进
- [ ] 演示代码改进
- [ ] 组件样式/交互改进
- [ ] CI/CD 改进
- [ ] 重构
- [ ] 代码风格优化
- [x ] 测试用例
- [ ] 分支合并
- [ ] 其他

### 🔗 相关 Issue

<!--
1. 描述相关需求的来源，如相关的 issue 讨论链接。
-->

### 💡 需求背景和解决方案

<!--
1. 要解决的具体问题。
2. 列出最终的 API 实现和用法。
3. 涉及UI/交互变动需要有截图或 GIF。
-->

### 📝 更新日志

<!--
从用户角度描述具体变化，以及可能的 breaking change 和其他风险。
-->

- other(PullDownRefresh): 补充测试用例

- [ ] 本条 PR 不需要纳入 Changelog

### ☑️ 请求合并前的自查清单

⚠️ 请自检并全部**勾选全部选项**。⚠️

- [ ] 文档已补充或无须补充
- [ ] 代码演示已提供或无须提供
- [ ] TypeScript 定义已补充或无须补充
- [ ] Changelog 已提供或无须提供



Patch:
diff --git a/src/_common b/src/_common
index a53b3999..b5fe3ced 160000
--- a/src/_common
+++ b/src/_common
@@ -1,1 +1,1 @@
-Subproject commit a53b3999b000bc12d196be1f5caf3c1b56e4ddfa
+Subproject commit b5fe3ceda2a32bd7ba78d9386d137bd5279fa8f2
diff --git a/src/action-sheet/action-sheet-list.vue b/src/action-sheet/action-sheet-list.vue
index efbe543d..7ba83084 100644
--- a/src/action-sheet/action-sheet-list.vue
+++ b/src/action-sheet/action-sheet-list.vue
@@ -34,6 +34,8 @@
 import { ref, defineComponent, PropType, computed } from 'vue';
 import config from '../config';
 import { ActionSheetItem } from './type';
+import TButton from '../button';
+import TBadge from '../badge';
 import { TNode } from '../shared';
 
 const { prefix } = config;
@@ -41,7 +43,7 @@ const { prefix } = config;
 const name = `${prefix}-action-sheet`;
 
 export default defineComponent({
-  components: { TNode },
+  components: { TNode, TButton, TBadge },
   props: {
     items: {
       type: Array as PropType<ActionSheetItem[]>,
diff --git a/src/action-sheet/action-sheet.vue b/src/action-sheet/action-sheet.vue
index a721d505..04f64bab 100644
--- a/src/action-sheet/action-sheet.vue
+++ b/src/action-sheet/action-sheet.vue
@@ -22,6 +22,7 @@ import { useEmitEvent, useDefault } from '../shared';
 import ActionSheetList from './action-sheet-list.vue';
 import ActionSheetGrid from './action-sheet-grid.vue';
 import TPopup from '../popup';
+import TButton from '../button';
 import config from '../config';
 import { TdActionSheetProps, ActionSheetItem } from './type';
 import ActionSheetProps from './props';
@@ -33,6 +34,7 @@ export default defineComponent({
   name,
   components: {
     TPopup,
+    TButton,
     ActionSheetList,
     ActionSheetGrid,
   },
diff --git a/src/dropdown-menu/dropdown-item.vue b/src/dropdown-menu/dropdown-item.vue
index 401653a5..9f215061 100644
--- a/src/dropdown-menu/dropdown-item.vue
+++ b/src/dropdown-menu/dropdown-item.vue
@@ -77,6 +77,7 @@ import { ref, watch, toRefs, inject, computed, reactive, onBeforeMount, defineCo
 import TRadio, { RadioGroup as TRadioGroup } from '../radio';
 import config from '../config';
 import TButton from '../button';
+import TPopup from '../popup';
 import TCheckbox, { CheckboxGroup as TCheckboxGroup } from '../checkbox';
 import { useVModel, useEmitEvent } from '../shared';
 import DropdownItemProps from './dropdown-item-props';
@@ -88,7 +89,7 @@ const name = `${prefix}-dropdown-item`;
 
 export default defineComponent({
   name,
-  components: { TRadio, TButton, TCheckbox, TRadioGroup, TCheckboxGroup },
+  components: { TRadio, TButton, TPopup, TCheckbox, TRadioGroup, TCheckboxGroup },
   props: DropdownItemProps,
   emits: ['change', 'open', 'opened', 'close', 'closed', 'update:value', 'update:modelValue'],
   setup(props, context) {
diff --git a/src/empty/empty.vue b/src/empty/empty.vue
index ba6a8c13..8bc4ada1 100644
--- a/src/empty/empty.vue
+++ b/src/empty/empty.vue
@@ -22,6 +22,7 @@
 
 <script lang="ts">
 import { toRefs, defineComponent, getCurrentInstance, computed } from 'vue';
+import TImage from '../image';
 import EmptyProps from './props';
 import config from '../config';
 import { renderTNode, TNode } from '../shared';
@@ -31,7 +32,7 @@ const name = `${prefix}-empty`;
 
 export default defineComponent({
   name,
-  components: { TNode },
+  components: { TNode, TImage },
 
   props: EmptyProps,
   setup(props, context) {
diff --git a/src/footer/footer.vue b/src/footer/footer.vue
index 8124fd4a..3b3b5a4f 100644
--- a/src/footer/footer.vue
+++ b/src/footer/footer.vue
@@ -26,6 +26,7 @@
 
 <script lang="ts">
 import { toRefs, defineComponent } from 'vue';
+import TImage from '../image';
 import FooterProps from './props';
 import config from '../config';
 
@@ -34,6 +35,7 @@ const name = `${prefix}-footer`;
 
 export default defineComponent({
   name,
+  components: { TImage },
   props: FooterProps,
   setup(props) {
     return {
diff --git a/src/input/input.vue b/src/input/input.vue
index be503318..aef309a5 100644
--- a/src/input/input.vue
+++ b/src/input/input.vue
@@ -2,7 +2,6 @@
   <div :class="styleWrapper">
     <div :class="`${componentName}__wrap--prefix`">
       <div :class="`${componentName}__icon--prefix`">
-        <slot name="prefix-icon" />
         <template v-if="prefixIconContent">
           <t-node :content="prefixIconContent"></t-node>
         </template>
@@ -40,7 +39,6 @@
           <t-node :content="suffixContent" />
         </div>
         <div v-if="suffixIconContent" :class="`${componentName}__wrap--suffix-icon`">
-          <slot name="suffix-icon" />
           <t-node :content="suffixIconContent"></t-node>
         </div>
       </div>
diff --git a/src/notice-bar/notice-bar.vue b/src/notice-bar/notice-bar.vue
index c7e8a74f..d80a025b 100644
--- a/src/notice-bar/notice-bar.vue
+++ b/src/notice-bar/notice-bar.vue
@@ -61,6 +61,7 @@ import {
 } from 'vue';
 import { InfoCircleFilledIcon, CheckCircleFilledIcon } from 'tdesign-icons-vue-next';
 import { isArray } from 'lodash';
+import { Swiper as TSwiper, SwiperItem as TSwiperItem } from '../swiper';
 import NoticeBarProps from './props';
 import { NoticeBarTrigger, DrawMarquee } from './type';
 import config from '../config';
@@ -76,7 +77,7 @@ const iconDefault = {
 };
 export default defineComponent({
   name,
-  components: { TNode },
+  components: { TNode, TSwiper, TSwiperItem },
   props: NoticeBarProps,
   emits: ['click'],
   setup(props, context) {
diff --git a/src/popup/popup.vue b/src/popup/popup.vue
index ba5160ee..f4ded0c0 100644
--- a/src/popup/popup.vue
+++ b/src/popup/popup.vue
@@ -8,7 +8,7 @@
         :style="rootStyles"
         @touchmove="handleMove"
       >
-        <div v-if="closeBtnNode" :class="`${name}__close`">
+        <div v-if="closeBtnNode" :class="`${name}__close`" @click="handleCloseClick">
           <t-node :content="closeBtnNode" />
         </div>
         <slot />
@@ -88,15 +88,15 @@ export default defineComponent({
 
     const closeBtnNode = computed(() =>
       renderTNode(currentInstance, 'closeBtn', {
-        defaultNode: h(CloseIcon, {
-          size: '24px',
-          onClick() {
-            setVisible(false);
-          },
-        }),
+        defaultNode: h(CloseIcon, { size: '24px' }),
       }),
     );
 
+    const handleCloseClick = (e: MouseEvent) => {
+      emitEvent('close', { e });
+      setVisible(false);
+    };
+
     const handleOverlayClick = (args: { e: MouseEvent }) => {
       const { e } = args;
       if (!props.closeOnOverlayClick) {
@@ -142,6 +142,7 @@ export default defineComponent({
       afterEnter,
       afterLeave,
       handleOverlayClick,
+      handleCloseClick,
       handleMove,
     };
   },
diff --git a/src/result/result.vue b/src/result/result.vue
index 8b16007a..ac41274c 100644
--- a/src/result/result.vue
+++ b/src/result/result.vue
@@ -2,7 +2,7 @@
   <div :class="classes">
     <div :class="`${name}__thumb`">
       <template v-if="imageContent">
-        <t-image v-if="typeof image === 'string'" v-bind="customImageProps"></t-image>
+        <t-image v-if="typeof image === 'string'" :src="image"></t-image>
         <t-node v-else :content="imageContent"></t-node>
       </template>
       <template v-else>
@@ -21,6 +21,7 @@
 <script lang="ts">
 import { h, computed, toRefs, getCurrentInstance, defineComponent } from 'vue';
 import { InfoCircleIcon, CheckCircleIcon, CloseCircleIcon } from 'tdesign-icons-vue-next';
+import TImage from '../image';
 import resultProps from './props';
 import config from '../config';
 import { renderTNode, TNode } from '../shared';
@@ -37,9 +38,7 @@ const iconDefault = {
 
 export default defineComponent({
   name,
-  components: {
-    TNode,
-  },
+  components: { TNode, TImage },
   props: resultProps,
   setup(props) {
     const internalInstance = getCurrentInstance();
@@ -58,19 +57,10 @@ export default defineComponent({
     }
     iconContent = props.icon ? computed(() => renderTNode(internalInstance, 'icon')) : iconContent;
 
-    const baseImageProps = {
-      src: props.image,
-    };
-
-    const customImageProps = computed(() => ({
-      ...baseImageProps,
-    }));
-
     return {
       name,
       classes,
       imageContent,
-      customImageProps,
       iconContent,
       titleContent,
       descriptionContent,
diff --git a/src/search/search.vue b/src/search/search.vue
index 8526a70d..4d57fb34 100644
--- a/src/search/search.vue
+++ b/src/search/search.vue
@@ -66,7 +66,7 @@ export default defineComponent({
     // left-icon
     const internalInstance = getCurrentInstance();
     const leftIconContent = computed(() => {
-      if (isFunction(props.leftIcon) || context.slots.prefixIcon) {
+      if (isFunction(props.leftIcon) || context.slots.leftIcon) {
         return renderTNode(internalInstance, 'leftIcon');
       }
       if (props.leftIcon) {


Test patch:
diff --git a/src/dialog/__test__/__snapshots__/demo.test.jsx.snap b/src/dialog/__test__/__snapshots__/demo.test.jsx.snap
index 9561c592..49ae0a54 100644
--- a/src/dialog/__test__/__snapshots__/demo.test.jsx.snap
+++ b/src/dialog/__test__/__snapshots__/demo.test.jsx.snap
@@ -880,8 +880,6 @@ exports[`Dialog > Dialog inputVue demo works fine 1`] = `
                   <div
                     class="t-input__icon--prefix"
                   >
-                    
-                    
                     <!--v-if-->
                   </div>
                   <div
@@ -1036,8 +1034,6 @@ exports[`Dialog > Dialog inputVue demo works fine 1`] = `
                   <div
                     class="t-input__icon--prefix"
                   >
-                    
-                    
                     <!--v-if-->
                   </div>
                   <div
@@ -1746,8 +1742,6 @@ exports[`Dialog > Dialog mobileVue demo works fine 1`] = `
                       <div
                         class="t-input__icon--prefix"
                       >
-                        
-                        
                         <!--v-if-->
                       </div>
                       <div
@@ -1902,8 +1896,6 @@ exports[`Dialog > Dialog mobileVue demo works fine 1`] = `
                       <div
                         class="t-input__icon--prefix"
                       >
-                        
-                        
                         <!--v-if-->
                       </div>
                       <div
diff --git a/src/form/__test__/__snapshots__/demo.test.jsx.snap b/src/form/__test__/__snapshots__/demo.test.jsx.snap
index 2f7057ad..d32ddd0a 100644
--- a/src/form/__test__/__snapshots__/demo.test.jsx.snap
+++ b/src/form/__test__/__snapshots__/demo.test.jsx.snap
@@ -40,8 +40,6 @@ exports[`Form > Form horizontalVue demo works fine 1`] = `
               <div
                 class="t-input__icon--prefix"
               >
-                
-                
                 <!--v-if-->
               </div>
               <div
@@ -117,8 +115,6 @@ exports[`Form > Form horizontalVue demo works fine 1`] = `
               <div
                 class="t-input__icon--prefix"
               >
-                
-                
                 <!--v-if-->
               </div>
               <div
@@ -336,8 +332,6 @@ exports[`Form > Form horizontalVue demo works fine 1`] = `
               <div
                 class="t-input__icon--prefix"
               >
-                
-                
                 <!--v-if-->
               </div>
               <div
@@ -661,8 +655,6 @@ exports[`Form > Form horizontalVue demo works fine 1`] = `
               <div
                 class="t-input__icon--prefix"
               >
-                
-                
                 <!--v-if-->
               </div>
               <div
@@ -1651,8 +1643,6 @@ exports[`Form > Form mobileVue demo works fine 1`] = `
                     <div
                       class="t-input__icon--prefix"
                     >
-                      
-                      
                       <!--v-if-->
                     </div>
                     <div
@@ -1728,8 +1718,6 @@ exports[`Form > Form mobileVue demo works fine 1`] = `
                     <div
                       class="t-input__icon--prefix"
                     >
-                      
-                      
                       <!--v-if-->
                     </div>
                     <div
@@ -1947,8 +1935,6 @@ exports[`Form > Form mobileVue demo works fine 1`] = `
                     <div
                       class="t-input__icon--prefix"
                     >
-                      
-                      
                       <!--v-if-->
                     </div>
                     <div
@@ -2272,8 +2258,6 @@ exports[`Form > Form mobileVue demo works fine 1`] = `
                     <div
                       class="t-input__icon--prefix"
                     >
-                      
-                      
                       <!--v-if-->
                     </div>
                     <div
@@ -3135,8 +3119,6 @@ exports[`Form > Form verticalVue demo works fine 1`] = `
               <div
                 class="t-input__icon--prefix"
               >
-                
-                
                 <!--v-if-->
               </div>
               <div
@@ -3211,8 +3193,6 @@ exports[`Form > Form verticalVue demo works fine 1`] = `
               <div
                 class="t-input__icon--prefix"
               >
-                
-                
                 <!--v-if-->
               </div>
               <div
@@ -3428,8 +3408,6 @@ exports[`Form > Form verticalVue demo works fine 1`] = `
               <div
                 class="t-input__icon--prefix"
               >
-                
-                
                 <!--v-if-->
               </div>
               <div
@@ -3752,8 +3730,6 @@ exports[`Form > Form verticalVue demo works fine 1`] = `
               <div
                 class="t-input__icon--prefix"
               >
-                
-                
                 <!--v-if-->
               </div>
               <div
diff --git a/src/input/__test__/__snapshots__/demo.test.jsx.snap b/src/input/__test__/__snapshots__/demo.test.jsx.snap
index 0af4e145..5f1c828f 100644
--- a/src/input/__test__/__snapshots__/demo.test.jsx.snap
+++ b/src/input/__test__/__snapshots__/demo.test.jsx.snap
@@ -14,8 +14,6 @@ exports[`Input > Input alignVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -54,8 +52,6 @@ exports[`Input > Input alignVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -94,8 +90,6 @@ exports[`Input > Input alignVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -140,8 +134,6 @@ exports[`Input > Input bannerVue demo works fine 1`] = `
     <div
       class="t-input__icon--prefix"
     >
-      
-      
       <!--v-if-->
     </div>
     <div
@@ -187,8 +179,6 @@ exports[`Input > Input baseVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -227,8 +217,6 @@ exports[`Input > Input baseVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -267,8 +255,6 @@ exports[`Input > Input baseVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -307,8 +293,6 @@ exports[`Input > Input baseVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -365,8 +349,6 @@ exports[`Input > Input borderedVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -395,8 +377,6 @@ exports[`Input > Input borderedVue demo works fine 1`] = `
           class="t-input__wrap--suffix-icon"
         >
           
-          
-          
           <svg
             class="t-icon t-icon-error-circle-filled"
             fill="none"
@@ -432,8 +412,6 @@ exports[`Input > Input customVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -476,8 +454,6 @@ exports[`Input > Input labelVue demo works fine 1`] = `
     <div
       class="t-input__icon--prefix"
     >
-      
-      
       <!--v-if-->
     </div>
     <div
@@ -519,8 +495,6 @@ exports[`Input > Input layoutVue demo works fine 1`] = `
     <div
       class="t-input__icon--prefix"
     >
-      
-      
       <!--v-if-->
     </div>
     <div
@@ -549,8 +523,6 @@ exports[`Input > Input layoutVue demo works fine 1`] = `
         class="t-input__wrap--suffix-icon"
       >
         
-        
-        
         <svg
           class="t-icon t-icon-error-circle-filled"
           fill="none"
@@ -586,8 +558,6 @@ exports[`Input > Input maxLengthVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -630,8 +600,6 @@ exports[`Input > Input maxLengthVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -714,8 +682,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -754,8 +720,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -794,8 +758,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -834,8 +796,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -900,8 +860,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -944,8 +902,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1010,8 +966,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1040,8 +994,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
               class="t-input__wrap--suffix-icon"
             >
               
-              
-              
               <svg
                 class="t-icon t-icon-info-circle-filled"
                 fill="none"
@@ -1070,8 +1022,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1131,8 +1081,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1161,8 +1109,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
               class="t-input__wrap--suffix-icon"
             >
               
-              
-              
               <svg
                 class="t-icon t-icon-user-avatar"
                 fill="none"
@@ -1217,8 +1163,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
             class="t-input__icon--prefix"
           >
             
-            
-            
             <svg
               class="t-icon t-icon-app"
               fill="none"
@@ -1271,8 +1215,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
             class="t-input__icon--prefix"
           >
             
-            
-            
             <svg
               class="t-icon t-icon-app"
               fill="none"
@@ -1346,8 +1288,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1401,8 +1341,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1460,8 +1398,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1518,8 +1454,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1562,8 +1496,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1632,8 +1564,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1676,8 +1606,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1737,8 +1665,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1802,8 +1728,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1842,8 +1766,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1882,8 +1804,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1943,8 +1863,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -1973,8 +1891,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
               class="t-input__wrap--suffix-icon"
             >
               
-              
-              
               <svg
                 class="t-icon t-icon-error-circle-filled"
                 fill="none"
@@ -2024,8 +1940,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
           <div
             class="t-input__icon--prefix"
           >
-            
-            
             <!--v-if-->
           </div>
           <div
@@ -2093,8 +2007,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
             <div
               class="t-input__icon--prefix"
             >
-              
-              
               <!--v-if-->
             </div>
             <div
@@ -2123,8 +2035,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
                 class="t-input__wrap--suffix-icon"
               >
                 
-                
-                
                 <svg
                   class="t-icon t-icon-error-circle-filled"
                   fill="none"
@@ -2177,8 +2087,6 @@ exports[`Input > Input mobileVue demo works fine 1`] = `
             <div
               class="t-input__icon--prefix"
             >
-              
-              
               <!--v-if-->
             </div>
             <div
@@ -2230,8 +2138,6 @@ exports[`Input > Input prefixVue demo works fine 1`] = `
         class="t-input__icon--prefix"
       >
         
-        
-        
         <svg
           class="t-icon t-icon-app"
           fill="none"
@@ -2284,8 +2190,6 @@ exports[`Input > Input prefixVue demo works fine 1`] = `
         class="t-input__icon--prefix"
       >
         
-        
-        
         <svg
           class="t-icon t-icon-app"
           fill="none"
@@ -2346,8 +2250,6 @@ exports[`Input > Input specialVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -2401,8 +2303,6 @@ exports[`Input > Input specialVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -2460,8 +2360,6 @@ exports[`Input > Input specialVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -2518,8 +2416,6 @@ exports[`Input > Input specialVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -2562,8 +2458,6 @@ exports[`Input > Input specialVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -2615,8 +2509,6 @@ exports[`Input > Input statusVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -2659,8 +2551,6 @@ exports[`Input > Input statusVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -2708,8 +2598,6 @@ exports[`Input > Input suffixVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -2738,8 +2626,6 @@ exports[`Input > Input suffixVue demo works fine 1`] = `
           class="t-input__wrap--suffix-icon"
         >
           
-          
-          
           <svg
             class="t-icon t-icon-info-circle-filled"
             fill="none"
@@ -2768,8 +2654,6 @@ exports[`Input > Input suffixVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -2829,8 +2713,6 @@ exports[`Input > Input suffixVue demo works fine 1`] = `
       <div
         class="t-input__icon--prefix"
       >
-        
-        
         <!--v-if-->
       </div>
       <div
@@ -2859,8 +2741,6 @@ exports[`Input > Input suffixVue demo works fine 1`] = `
           class="t-input__wrap--suffix-icon"
         >
           
-          
-          
           <svg
             class="t-icon t-icon-user-avatar"
             fill="none"
diff --git a/src/input/__test__/index.test.jsx b/src/input/__test__/index.test.jsx
index 0ce6e2ec..b03449f3 100644
--- a/src/input/__test__/index.test.jsx
+++ b/src/input/__test__/index.test.jsx
@@ -7,7 +7,6 @@ import { CloseCircleFilledIcon, InfoCircleFilledIcon, AppIcon } from 'tdesign-ic
 
 const prefix = 't';
 const name = `${prefix}-input`;
-const alignList = ['center', 'right'];
 
 const simulateEvent = (target, text, event) => {
   target.value = text;
@@ -16,26 +15,24 @@ const simulateEvent = (target, text, event) => {
 
 describe('Input.vue', async () => {
   describe('props', async () => {
-    // it(': value', async () => {
-    //   const value = ref('123');
-    //   const wrapper = mount(<Input v-model={value.value} />);
-    //   expect(wrapper.classes()).toContain('t-input');
-    //   expect(wrapper.classes()).toContain('t-cell');
-    //   const input = wrapper.find('.t-input__wrap input');
-    //   expect(input.exists()).toBeTruthy();
-    //   expect(input.element.value).toBe('123');
-    // });
-
-    // it(': maxcharacter', async () => {
-    //   const value = ref('');
-    //   const maxcharacter = 2;
-    //   const onChange = vi.fn();
-    //   const wrapper = mount(<Input v-model={value.value} maxcharacter={maxcharacter} onChange={onChange} />);
-    //   const el = wrapper.find('input').element;
-    //   await simulateEvent(el, '一个汉字等于两个字符，超出会被剪切', 'input');
-    //   expect(onChange).toBeCalledTimes(1);
-    //   expect(onChange).toHaveBeenCalledWith('一');
-    // });
+    it(': value', async () => {
+      const value = ref('123');
+      const wrapper = mount(<Input v-model={value.value} />);
+      const input = wrapper.find('.t-input input');
+      expect(input.exists()).toBeTruthy();
+      expect(input.element.value).toBe('123');
+    });
+
+    it(': maxcharacter', async () => {
+      const value = ref('');
+      const maxcharacter = 2;
+      const onChange = vi.fn();
+      const wrapper = mount(<Input v-model={value.value} maxcharacter={maxcharacter} onChange={onChange} />);
+      const el = wrapper.find('input').element;
+      await simulateEvent(el, '一个汉字等于两个字符，超出会被剪切', 'input');
+      expect(onChange).toBeCalledTimes(1);
+      expect(onChange).toHaveBeenCalledWith('一');
+    });
 
     it(': placeholder', async () => {
       const wrapper = mount(<Input placeholder="请输入" />);
@@ -43,54 +40,55 @@ describe('Input.vue', async () => {
       expect(input.attributes('placeholder')).toBe('请输入');
     });
 
-    // it(': label', async () => {
-    //   const wrapper = mount(<Input label="标题" />);
-    //   const label = wrapper.find('.t-cell__title .t-input--label');
-    //   expect(label.exists()).toBeTruthy();
-    //   expect(label.text()).toBe('标题');
-    // });
-
-    // it(': required', async () => {
-    //   const wrapper = mount(<Input label="标题" required />);
-    //   const required = wrapper.find('.t-cell__title .t-cell--required');
-    //   expect(required.exists()).toBeTruthy();
-    //   expect(required.text()).toContain('*');
-    // });
-
-    // it(': errorMessage', async () => {
-    //   const wrapper = mount(<Input label="标题" errorMessage="错误信息" />);
-    //   const errorMessage = wrapper.find('.t-input__error-msg');
-    //   expect(errorMessage.exists()).toBeTruthy();
-    //   expect(errorMessage.text()).toBe('错误信息');
-    // });
-
-    // it(': align', async () => {
-    //   alignList.forEach((a) => {
-    //     const wrapper = mount(<Input label="标题" align={a} />);
-    //     const control = wrapper.find(`.t-input__control--${a}`);
-    //     expect(control.exists()).toBeTruthy();
-    //   });
-    // });
-
-    // it(': clearable', async () => {
-    //   const value = ref('123');
-    //   const handleClear = vi.fn();
-    //   const wrapper = mount(<Input label="标题" v-model={value.value} clearable onClear={handleClear} />);
-    //   const closeIcon = wrapper.findComponent(CloseCircleFilledIcon);
-    //   expect(closeIcon.exists()).toBeTruthy();
-    //   await closeIcon.trigger('click');
-    //   expect(value.value).toBe('');
-    //   expect(handleClear).toBeCalled();
-    // });
-
-    // it(': disabled', async () => {
-    //   const value = ref('123');
-    //   const wrapper = mount(<Input label="标题" v-model={value.value} disabled />);
-    //   const label = wrapper.find('.t-input--label');
-    //   expect(label.classes()).toContain('t-is-disabled');
-    //   const input = wrapper.find('.t-input__wrap input');
-    //   expect(input.element.hasAttribute('disabled')).toBeTruthy();
-    // });
+    it(': label', async () => {
+      const wrapper = mount(<Input label="标题" />);
+      const label = wrapper.find('.t-input__label');
+      expect(label.exists()).toBeTruthy();
+      expect(label.text()).toBe('标题');
+    });
+
+    it(': tips', async () => {
+      const wrapper = mount(<Input label="标题" tips="错误信息" />);
+      const $tips = wrapper.find('.t-input__tips');
+      expect($tips.exists()).toBeTruthy();
+      expect($tips.text()).toBe('错误信息');
+    });
+
+    it(': align', async () => {
+      const alignList = ['', 'left', 'center', 'right'];
+      alignList.forEach((align) => {
+        const tips = 'tips';
+        const wrapper = mount(<Input label="标题" align={align} tips={tips} />);
+        const $tips = wrapper.find('.t-input__tips');
+        const control = wrapper.find(`.t-input__control`);
+
+        if (align && align !== 'left') {
+          expect(control.classes()).toContain(`t-input--${align}`);
+        }
+
+        expect($tips.classes()).contain(`t-input--${align}`);
+      });
+    });
+
+    it(': clearable', async () => {
+      const value = ref('123');
+      const handleClear = vi.fn();
+      const wrapper = mount(<Input label="标题" v-model={value.value} clearable onClear={handleClear} />);
+      const closeIcon = wrapper.findComponent(CloseCircleFilledIcon);
+      expect(closeIcon.exists()).toBeTruthy();
+      await closeIcon.trigger('click');
+      expect(value.value).toBe('');
+      expect(handleClear).toBeCalled();
+    });
+
+    it(': disabled', async () => {
+      const value = ref('123');
+      const wrapper = mount(<Input label="标题" v-model={value.value} disabled />);
+      const label = wrapper.find('.t-input__label');
+      expect(label.classes()).toContain('t-is-disabled');
+      const input = wrapper.find('.t-input__wrap input');
+      expect(input.element.hasAttribute('disabled')).toBeTruthy();
+    });
 
     it(': readonly', async () => {
       const value = ref('123');
@@ -112,10 +110,25 @@ describe('Input.vue', async () => {
       expect(input.element.getAttribute('autocomplete')).toBe('On');
     });
 
-    // it(': size', async () => {
-    //   const wrapper = mount(() => <Input label="标题" size="small" />);
-    //   expect(wrapper.classes()).toContain('t-input--size-small');
-    // });
+    it(': size', async () => {
+      const sizeList = ['', 'small', 'meddium', 'large'];
+      sizeList.forEach((size, index) => {
+        const wrapper = mount(() => <Input label="标题" size={size} />);
+        if (size) {
+          expect(wrapper.classes()).toContain(`t-input--size-${size}`);
+        }
+      });
+    });
+
+    it(': layout', async () => {
+      const layoutList = ['', 'vertical', 'horizontal'];
+      layoutList.forEach((layout, index) => {
+        const wrapper = mount(() => <Input label="标题" layout={layout} />);
+        if (layout) {
+          expect(wrapper.classes()).toContain(`t-input--layout-${layout}`);
+        }
+      });
+    });
 
     it(': type', async () => {
       const wrapper = mount(<Input label="标题" type="number" />);
@@ -175,21 +188,29 @@ describe('Input.vue', async () => {
       inputRef.value.blur(); // 调用 blur 方法，实现失焦
       await nextTick();
     });
+
+    it(': compositionend', async () => {
+      const onCompositionend = vi.fn();
+      const wrapper = mount(<Input label="标题" onCompositionend={onCompositionend} />);
+      const $input = wrapper.find('input');
+      await $input.trigger('compositionend');
+      expect(onCompositionend).toBeCalled();
+    });
   });
 
-  // describe('slots', async () => {
-  //   it(': icon', async () => {
-  //     const slots = {
-  //       prefixIcon: () => <InfoCircleFilledIcon />,
-  //       suffixIcon: () => <AppIcon />,
-  //     };
-  //     const wrapper = mount(<Input label="标题" v-slots={slots} />);
-  //     const leftIcon = wrapper.find('.t-cell__left-icon svg');
-  //     const rightIcon = wrapper.find('.t-cell__right-icon svg');
-  //     expect(wrapper.findComponent(InfoCircleFilledIcon).exists()).toBeTruthy();
-  //     expect(wrapper.findComponent(AppIcon).exists()).toBeTruthy();
-  //     expect(leftIcon.exists()).toBeTruthy();
-  //     expect(rightIcon.exists()).toBeTruthy();
-  //   });
-  // });
+  describe('slots', async () => {
+    it(': prefixIcon && suffixIcon', async () => {
+      const slots = {
+        prefixIcon: () => <InfoCircleFilledIcon />,
+        suffixIcon: () => <AppIcon />,
+      };
+      const wrapper = mount(<Input label="标题" v-slots={slots} />);
+      const prefixIcon = wrapper.find('.t-input__icon--prefix svg');
+      const suffixIcon = wrapper.find('.t-input__wrap--suffix-icon svg');
+      expect(prefixIcon.exists()).toBeTruthy();
+      expect(suffixIcon.exists()).toBeTruthy();
+      expect(wrapper.findComponent(InfoCircleFilledIcon).exists()).toBeTruthy();
+      expect(wrapper.findComponent(AppIcon).exists()).toBeTruthy();
+    });
+  });
 });
diff --git a/src/popup/__test__/index.test.jsx b/src/popup/__test__/index.test.jsx
index 8281a01a..7a31757c 100644
--- a/src/popup/__test__/index.test.jsx
+++ b/src/popup/__test__/index.test.jsx
@@ -2,6 +2,7 @@ import { config, mount } from '@vue/test-utils';
 import { describe, it, expect, vi } from 'vitest';
 import Popup from '../popup.vue';
 import { ref } from 'vue';
+import { CloseIcon } from 'tdesign-icons-vue-next';
 
 config.global.stubs = {
   teleport: true,
@@ -29,18 +30,42 @@ describe('popup', () => {
       expect(onOpen).toBeCalledTimes(1);
     });
 
-    it(':placement', async () => {
+    it(':closeBtn', async () => {
+      const icon = () => <CloseIcon />;
       const wrapper = mount(Popup, {
         props: {
-          placement: 'top',
+          closeBtn: true,
           visible: true,
         },
       });
-      expect(wrapper.find('.t-popup').classes()).toContain(`t-popup--${wrapper.vm.placement}`);
+      expect(wrapper.find('.t-popup__close').exists()).toBeTruthy();
+      // closeBtn = true, 使用默认 CloseIcon
+      expect(wrapper.findComponent(CloseIcon).exists()).toBeTruthy();
+
+      await wrapper.setProps({
+        closeBtn: false,
+      });
+      expect(wrapper.find('.t-popup__close').exists()).toBeFalsy();
+
+      const temp = '取消';
       await wrapper.setProps({
-        placement: 'center',
+        closeBtn: () => {
+          return temp;
+        },
+      });
+      expect(wrapper.find('.t-popup__close').exists()).toBeTruthy();
+      expect(wrapper.find('.t-popup__close').text()).toEqual(temp);
+    });
+
+    it(':placement', async () => {
+      const placementList = ['', 'top', 'left', 'right', 'bottom', 'center'];
+      placementList.forEach((placement, index) => {
+        const wrapper = mount(() => <Popup visible={true} placement={placement} />);
+        const $popup = wrapper.find('.t-popup');
+        if (placement) {
+          expect($popup.classes()).toContain(`t-popup--${placement}`);
+        }
       });
-      expect(wrapper.find('.t-popup').classes()).toContain(`t-popup--${wrapper.vm.placement}`);
     });
 
     it(':zIndex', async () => {
@@ -86,6 +111,7 @@ describe('popup', () => {
             <Popup
               placement="bottom"
               transition-name="slide-fade"
+              closeBtn={true}
               visible={visible.value}
               onVisibleChange={onVisibleChange}
               onOpen={open}
@@ -99,12 +125,17 @@ describe('popup', () => {
 
       const $popup = wrapper.find('.t-popup');
       const $overlay = wrapper.find('.t-overlay');
+      const $closeBtn = wrapper.find('.t-popup__close');
 
       await $overlay.trigger('click');
 
       expect(onVisibleChange).toBeCalledTimes(1);
       expect(close).toBeCalledTimes(1);
 
+      await $closeBtn.trigger('click');
+      expect(onVisibleChange).toBeCalledTimes(2);
+      expect(close).toBeCalledTimes(2);
+
       const $transition = wrapper.findAllComponents({ name: 'transition' }); // => 通过 `name` 找到 transition
       expect($transition).toHaveLength(2);
 
diff --git a/src/pull-down-refresh/__test__/index.test.jsx b/src/pull-down-refresh/__test__/index.test.jsx
index 57dd58f4..905f1f91 100644
--- a/src/pull-down-refresh/__test__/index.test.jsx
+++ b/src/pull-down-refresh/__test__/index.test.jsx
@@ -63,6 +63,13 @@ describe('PullDownRefresh', () => {
   });
 
   describe(':events', () => {
+    it('transitionend', async () => {
+      const wrapper = mount(<PullDownRefresh value={true} loadingBarHeight={30} maxBarHeight={80} />);
+
+      const track = wrapper.find('.t-pull-down-refresh__track');
+      track.trigger(`transitionend`);
+    });
+
     it('timeout', async () => {
       const status = ref(false);
       const refreshTimeout = 500;
@@ -77,15 +84,15 @@ describe('PullDownRefresh', () => {
       });
       const onTimeout = vi.fn();
 
-      const wrapper = mount(
-        () => <PullDownRefresh
+      const wrapper = mount(() => (
+        <PullDownRefresh
           value={status.value}
           refreshTimeout={refreshTimeout}
           onChange={onChange}
           onRefresh={onRefresh}
           onTimeout={onTimeout}
-        />,
-      );
+        />
+      ));
 
       const target = wrapper.find('.t-pull-down-refresh__track');
       const maxBar = wrapper.find('.t-pull-down-refresh__tips');
@@ -107,7 +114,7 @@ describe('PullDownRefresh', () => {
       });
 
       // expect(wrapper.emitted()).toHaveProperty('update:value'); // useModel 受控模式
-      
+
       expect(onChange).toHaveBeenCalled();
       expect(onRefresh).toHaveBeenCalled();
       expect(onTimeout).toHaveBeenCalled();
diff --git a/src/search/__test__/index.test.jsx b/src/search/__test__/index.test.jsx
index 81768d6e..1a6f3d8a 100644
--- a/src/search/__test__/index.test.jsx
+++ b/src/search/__test__/index.test.jsx
@@ -37,7 +37,9 @@ describe('search', () => {
       // shape = 'round'
       expect($inputBox.classes().includes(`${name}__input-box--round`)).toBeTruthy();
     });
+  });
 
+  describe('event', () => {
     it(': onFocus', async () => {
       const value = '聚焦测试';
       let focusValue = '';
@@ -98,6 +100,44 @@ describe('search', () => {
       expect(onBlur).toBeCalled();
       expect($search.classes().includes(`${prefix}-is-focused`)).toBeFalsy();
     });
+
+    it(':onKeypress', async () => {
+      const onKeypress = vi.fn();
+      const wrapper = mount(Search, {
+        props: {
+          onKeypress,
+        },
+      });
+      const $input = wrapper.find(`input`);
+      await $input.trigger('keypress');
+      expect(onKeypress).toBeCalled();
+    });
+
+    it(':onCompositionend', async () => {
+      const onCompositionend = vi.fn();
+      const wrapper = mount(Search, {
+        props: {
+          onCompositionend,
+        },
+      });
+      const $input = wrapper.find('input');
+      await $input.trigger('compositionend');
+      expect(onCompositionend).toBeCalled();
+    });
+
+    it(':onActionClick', async () => {
+      const onActionClick = vi.fn();
+      const wrapper = mount(Search, {
+        props: {
+          action: '取消',
+          focus: true,
+          onActionClick,
+        },
+      });
+      const $input = wrapper.find(`.${name}__search-action`);
+      await $input.trigger('click');
+      expect(onActionClick).toBeCalled();
+    });
   });
 
   describe('slots', () => {
@@ -112,5 +152,19 @@ describe('search', () => {
       const $search = wrapper.find(`.${name}`);
       expect($search.text()).toEqual(action);
     });
+
+    it(': left-icon', async () => {
+      const text = '插槽';
+      const leftIcon = () => {
+        return text;
+      };
+      const wrapper = mount(Search, {
+        slots: {
+          leftIcon,
+        },
+      });
+      const $search = wrapper.find(`.${name}`);
+      expect($search.text()).toEqual(text);
+    });
   });
 });
diff --git a/src/stepper/__test__/index.test.jsx b/src/stepper/__test__/index.test.jsx
index 42c673de..6f66c03a 100644
--- a/src/stepper/__test__/index.test.jsx
+++ b/src/stepper/__test__/index.test.jsx
@@ -4,6 +4,11 @@ import { nextTick } from 'vue';
 import Stepper from '../stepper.vue';
 import { ref } from 'vue';
 
+const simulateEvent = (target, text, event) => {
+  target.value = text;
+  target.dispatchEvent(new Event(event));
+};
+
 describe('stepper', () => {
   describe('props', () => {
     it(': disabled', async () => {
@@ -164,5 +169,29 @@ describe('stepper', () => {
       expect(onBlur).toHaveBeenCalled(1);
       expect(value.value).toBe(2);
     });
+
+    it(': focus', async () => {
+      const data = ref('');
+      const onFocus = vi.fn();
+      const wrapper = mount(<Stepper v-model={data.value} onFocus={onFocus} />);
+
+      const $input = wrapper.find('.t-stepper__input');
+      await $input.trigger('focus');
+      expect(onFocus).toBeCalled();
+    });
+
+    it(': input ', async () => {
+      const data = ref('');
+      const value = ref('');
+      const handleChange = (val) => {
+        value.value = val;
+      };
+      const wrapper = mount(<Stepper v-model={data.value} onChange={handleChange} />);
+      const $input = wrapper.find('.t-stepper__input').element;
+
+      const inputValue = 12;
+      await simulateEvent($input, inputValue, 'input');
+      expect(value.value).toBe(inputValue);
+    });
   });
 });
diff --git a/src/switch/__test__/index.test.jsx b/src/switch/__test__/index.test.jsx
index 4b4f9f55..024f0277 100644
--- a/src/switch/__test__/index.test.jsx
+++ b/src/switch/__test__/index.test.jsx
@@ -47,5 +47,32 @@ describe('switch', () => {
       });
       expect(wrapper.classes()).not.toContain('t-switch--disabled');
     });
+
+    it(': size', async () => {
+      const wrapper = mount(Switch, {
+        props: {
+          size: '',
+        },
+      });
+      expect(wrapper.classes()).toContain('t-switch--');
+      await wrapper.setProps({
+        size: 'small',
+      });
+
+      expect(wrapper.classes()).toContain('t-switch--small');
+    });
+  });
+  describe('event', () => {
+    it(': onChange', async () => {
+      const onChange = vi.fn();
+      const wrapper = mount(Switch, {
+        props: {
+          onChange,
+        },
+      });
+      const $switch = wrapper.find('.t-switch');
+      await $switch.trigger('click');
+      expect(onChange).toHaveBeenCalled();
+    });
   });
 });
diff --git a/src/textarea/__test__/index.test.jsx b/src/textarea/__test__/index.test.jsx
index 1eb215f7..fbc2d6ca 100644
--- a/src/textarea/__test__/index.test.jsx
+++ b/src/textarea/__test__/index.test.jsx
@@ -62,6 +62,16 @@ describe('Textarea.vue', () => {
     expect(textarea.element.hasAttribute('disabled')).toBeTruthy();
   });
 
+  it(': indicator', async () => {
+    const maxcharacter = 20;
+    const wrapper = mount(<Textarea label="标题" indicator maxcharacter={maxcharacter} />);
+    const indicator = wrapper.find('.t-textarea__indicator');
+    expect(indicator.exists()).toBeTruthy();
+    expect(indicator.text()).toBe(`0/${maxcharacter}`);
+  });
+});
+
+describe(':event', () => {
   it(': onBlur', async () => {
     const onBlur = vi.fn();
     const onFocus = vi.fn();
@@ -79,6 +89,14 @@ describe('Textarea.vue', () => {
     expect(onFocus).toBeCalled();
   });
 
+  it(': onCompositionend', async () => {
+    const onCompositionend = vi.fn();
+    const wrapper = mount(<Textarea label="标题" onCompositionend={onCompositionend} />);
+    const textarea = wrapper.find('textarea');
+    await textarea.trigger('compositionend');
+    expect(onCompositionend).toBeCalled();
+  });
+
   it(': onChange ', async () => {
     const data = ref('');
     const value = ref('');
diff --git a/src/toast/__test__/index.test.jsx b/src/toast/__test__/index.test.jsx
index 1f9ab569..a826f5d3 100644
--- a/src/toast/__test__/index.test.jsx
+++ b/src/toast/__test__/index.test.jsx
@@ -15,6 +15,15 @@ describe('Toast', () => {
         direction: 'column',
       });
       expect(wrapper.find('.t-toast').classes()).toContain('t-toast--column');
+
+      const directionList = ['', 'row', 'column'];
+      directionList.forEach((direction, index) => {
+        const wrapper = mount(() => <Toast direction={direction} message="direction" />);
+        const $toast = wrapper.find('.t-toast');
+        if (direction) {
+          expect($toast.classes()).toContain(`t-toast--${direction}`);
+        }
+      });
     });
 
     it(': icon', async () => {