Skip to content

Тестирование

Обзор

Библиотека vue3-truncate-html включает в себя комплексное тестирование для обеспечения стабильности и надежности компонента. Тесты написаны с использованием Vitest и Vue Test Utils.

Структура тестов

Основные тесты находятся в файле src/VueTruncateHtml.test.ts и покрывают следующие сценарии:

1. Базовое монтирование компонента

typescript
test('mounts without props', () => {
  const wrapper = mount(VueTruncateHtml, {
    props: {
      modelValue: true
    }
  })
  expect(wrapper.exists()).toBe(true)
})

2. Тестирование с текстом

typescript
test('displays text correctly', () => {
  const text = 'Test text content'
  const wrapper = mount(VueTruncateHtml, {
    props: {
      modelValue: true,
      text,
      length: 50
    }
  })
  expect(wrapper.text()).toContain(text)
})

3. Тестирование с HTML

typescript
test('renders HTML content', () => {
  const html = '<p><strong>Bold text</strong></p>'
  const wrapper = mount(VueTruncateHtml, {
    props: {
      modelValue: true,
      text: html,
      type: 'html'
    }
  })
  expect(wrapper.html()).toContain('<strong>Bold text</strong>')
})

4. Тестирование логики обрезки

typescript
test('truncates long text', () => {
  const longText = 'A'.repeat(200)
  const wrapper = mount(VueTruncateHtml, {
    props: {
      modelValue: true,
      text: longText,
      length: 100
    }
  })
  
  const content = wrapper.find('.vue-truncate-html__content')
  expect(content.text().length).toBeLessThanOrEqual(100)
})

5. Тестирование кнопок

typescript
test('shows/hides button based on text length', () => {
  const shortText = 'Short text'
  const wrapper = mount(VueTruncateHtml, {
    props: {
      modelValue: true,
      text: shortText,
      length: 100
    }
  })
  
  const button = wrapper.find('.vue-truncate-html__button')
  expect(button.exists()).toBe(false)
})

6. Тестирование пользовательских кнопок

typescript
test('displays custom button text', () => {
  const customButtons = {
    more: 'Показать больше',
    less: 'Показать меньше'
  }
  
  const wrapper = mount(VueTruncateHtml, {
    props: {
      modelValue: true,
      text: 'A'.repeat(200),
      buttons: customButtons
    }
  })
  
  const button = wrapper.find('.vue-truncate-html__button')
  expect(button.text()).toBe('Показать больше')
})

Запуск тестов

Запуск всех тестов

bash
npm test

Запуск тестов в режиме наблюдения

bash
npm run test:watch

Генерация отчета о покрытии

bash
npm run test:coverage

Тестирование в вашем проекте

Базовый тест компонента

vue
<!-- MyComponent.vue -->
<template>
  <vue-truncate-html
    v-model="isTruncated"
    :text="text"
    :length="100" />
</template>

<script setup>
import { ref } from 'vue'
import { VueTruncateHtml } from 'vue3-truncate-html'

const isTruncated = ref(true)
const text = ref('Long text content...')
</script>
typescript
// MyComponent.test.ts
import { mount } from '@vue/test-utils'
import MyComponent from './MyComponent.vue'

describe('MyComponent', () => {
  test('renders VueTruncateHtml component', () => {
    const wrapper = mount(MyComponent)
    
    const truncateComponent = wrapper.findComponent({ name: 'VueTruncateHtml' })
    expect(truncateComponent.exists()).toBe(true)
  })
  
  test('passes correct props to VueTruncateHtml', () => {
    const wrapper = mount(MyComponent)
    
    const truncateComponent = wrapper.findComponent({ name: 'VueTruncateHtml' })
    expect(truncateComponent.props('length')).toBe(100)
    expect(truncateComponent.props('text')).toBe('Long text content...')
  })
})

Тестирование событий

typescript
test('handles modelValue updates', async () => {
  const wrapper = mount(VueTruncateHtml, {
    props: {
      modelValue: true,
      text: 'A'.repeat(200),
      'onUpdate:modelValue': (value) => wrapper.setProps({ modelValue: value })
    }
  })
  
  const button = wrapper.find('.vue-truncate-html__button')
  await button.trigger('click')
  
  expect(wrapper.emitted('update:modelValue')).toBeTruthy()
  expect(wrapper.emitted('update:modelValue')[0]).toEqual([false])
})

Тестирование с пользовательскими стилями

typescript
test('applies custom CSS classes', () => {
  const customClasses = {
    container: 'custom-container',
    content: 'custom-content',
    button: 'custom-button'
  }
  
  const wrapper = mount(VueTruncateHtml, {
    props: {
      modelValue: true,
      text: 'A'.repeat(200),
      classes: customClasses
    }
  })
  
  expect(wrapper.find('.custom-container').exists()).toBe(true)
  expect(wrapper.find('.custom-content').exists()).toBe(true)
  expect(wrapper.find('.custom-button').exists()).toBe(true)
})

Рекомендации по тестированию

1. Тестируйте основные сценарии

  • Монтирование компонента с различными props
  • Корректное отображение текста и HTML
  • Работа логики обрезки
  • Функциональность кнопок

2. Проверяйте граничные случаи

  • Пустой текст
  • Очень длинный текст
  • HTML с небезопасным содержимым
  • Некорректные props

3. Тестируйте интеграцию

  • Взаимодействие с родительскими компонентами
  • Передача событий
  • Реактивность данных

4. Используйте моки для внешних зависимостей

typescript
// Мокирование html-truncate
vi.mock('html-truncate', () => ({
  default: vi.fn((text, length) => text.substring(0, length))
}))

Continuous Integration

Для автоматического запуска тестов в CI/CD используйте следующую конфигурацию:

yaml
# .github/workflows/test.yml
name: Tests

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-node@v3
      with:
        node-version: '18'
        cache: 'npm'
    
    - run: npm ci
    - run: npm test
    - run: npm run test:coverage

Отладка тестов

Использование Vue DevTools

typescript
import { config } from '@vue/test-utils'

// Включение Vue DevTools в тестах
config.global.config.devtools = true

Отладка с помощью console.log

typescript
test('debug component state', () => {
  const wrapper = mount(VueTruncateHtml, {
    props: { modelValue: true, text: 'test' }
  })
  
  console.log('Component HTML:', wrapper.html())
  console.log('Component props:', wrapper.props())
})

Полезные ресурсы

Качественное тестирование обеспечивает стабильность вашего приложения и упрощает поддержку кода в долгосрочной перспективе.