MenuItem.spec.js 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { describe, it, expect, beforeEach } from 'vitest'
  2. import { mount } from '@vue/test-utils'
  3. import MenuItemVue from '../MenuItem.vue'
  4. import { MenuItem } from '@/helpers/common'
  5. import { createPinia, setActivePinia } from 'pinia'
  6. describe('MenuItem', () => {
  7. let wrapper
  8. // перед выполнением каждого теста мы должны создать окружение
  9. // в нашем случае хранилище и экземпляр компонента
  10. beforeEach(() => {
  11. setActivePinia(createPinia())
  12. // метод mount монтирует компонент с параметрами
  13. wrapper = mount(MenuItemVue, {
  14. props: { item: new MenuItem('test', 100) }
  15. })
  16. })
  17. // в интернетах пишут, что it это просто алиас для test
  18. it('Элемент меню содержит название', () => {
  19. // здесь мы получаем текстовое представление компонента (text())
  20. // и ищем в нём название блюда (toContain)
  21. // если находит, значит компонент смонтировался нормально
  22. expect(wrapper.text()).toContain('test')
  23. })
  24. it('У элемента меню есть кнопка и при клике на неё цена переезжает в описание', async () => {
  25. // метод find ищет в компоненте элемент или класс (тема css-селекторы)
  26. // и генерирует на нём событие click
  27. await wrapper.find('.price-button').trigger('click')
  28. // все события, генерируемые компонентом, собираются в очередь
  29. // и мы просто проверяем длину очереди событий
  30. // expect(wrapper.emitted('click')).toHaveLength(1)
  31. // в название должна переехать цена
  32. const title = wrapper.find('.title')
  33. expect(title.text()).toContain('100')
  34. })
  35. it.skip('Элемент меню генерирует событие click', () => {
  36. // компонент обрабатывает клик прямо по внешнему div-у
  37. // поэтому можем генерировать событие прямо на нём
  38. wrapper.trigger('click')
  39. // если бы в компонента была какая-то кнопка, то надо было бы
  40. // генерировать событие у неё
  41. // wrapper.find('button').trigger('click')
  42. // все события, генерируемые компонентом, собираются в очередь
  43. // и мы просто проверяем длину очереди событий
  44. expect(wrapper.emitted('click')).toHaveLength(1)
  45. })
  46. it('При клике на кнопку с ценой должен появиться счётчик и кнопки "-" и "+", при клике на кнопку "+" счётчик должен приянть значение "2"', async () => {
  47. // после клика перестраивается DOM, поэтому заворачиваем в await
  48. await wrapper.find('.price-button').trigger('click')
  49. // в компоненте должен появиться элемент с классом .qty-value
  50. expect(wrapper.find('.qty-value').exists()).toBe(true)
  51. // кнопка "-"
  52. expect(wrapper.find('.qty-minus').exists()).toBe(true)
  53. // и кнопка "+"
  54. const plusButton = wrapper.find('.qty-plus')
  55. expect(plusButton.exists()).toBe(true)
  56. await plusButton.trigger('click')
  57. const value = wrapper.find('.qty-value')
  58. expect(value.text()).toEqual('2')
  59. // expect(value.element.text).toContain('1')
  60. })
  61. })
  62. // https://blog.logrocket.com/advanced-guide-vitest-testing-mocking/
  63. // https://github.com/mayashavin/component-testing-vitest/blob/main/src/components/__tests__/Movies.spec.js
  64. // https://www.vuemastery.com/blog/getting-started-with-vitest/#wrapping-up
  65. // https://github.com/igorbabko/vue-unit-testing/blob/main/test/components/ActivityItem.test.ts