Как проводить проверку входных данных внутри функций?

Как можно эффективно написать юнит-тесты для стора pinia во Vue 3 с использованием vitest и coverage v8? Я начал с попытки покрытия тестами функций стора, но столкнулся с проблемой оценки покрытия условных выражений и обработки локального хранилища. Например, как я могу протестировать код внутри условия `if (orderLocalStorage) {...}`? Также интересует, как протестировать условные выражения внутри функций, например вот этот код:

```javascript
function updateOrder(product) {
  let x = -1;
  if (product) {
    x += 1;
  } else {
    x -= 1;
  }
  order.value.push({ id: x });
}
```
  • 10 января 2024 г. 17:28
Ответы на вопрос 2
Проверка входных данных внутри функций:
Чтобы проверить входные данные, вам нужно рассмотреть различные аспекты, такие как тип данных, формат, допустимый диапазон значений и необходимость данных. Вот щаги и пример для проверки аргументов функции `updateOrder`:

1. Проверьте, что `product` не `undefined` и не `null`.
2. Проверьте, что `product` имеет ожидаемый тип данных (например, `object`).
3. Проверьте, что у `product` есть все необходимые свойства.
4. Предусмотрите логику для недопустимых входных значений.

```javascript
function updateOrder(product) {
  if (typeof product !== 'object' || product === null) {
    // Недопустимый продукт, выбросите исключение или обработайте ошибку
    throw new Error('Invalid product provided');
  }
  
  // Дальнейшая логика функции...
  let x = -1;
  if (product) {
     x += 1;
  } else {
     x -= 1;
  }
  order.value.push({ id: x });
}
```

Тестирование юнит-тестов для стора Pinia в Vue 3 с использованием Vitest и Coverage v8:

Чтобы покрыть тестами ваш пример с условным оператором, вам нужно создать два теста: один для случая, когда условие `true`, и один для случая, когда оно `false`. Это поможет покрыть оба условия исполнения `if-else`. Вот пример:

1. Импортируйте соответствующие утилиты и ваш Pinia store.
2. Создайте инстанс Pinia и установите его в контекст вашего приложения Vue.
3. Напишите тесты для разных условий.

```javascript
import { describe, it, expect } from 'vitest';
import { setActivePinia, createPinia } from 'pinia';
import { useYourStore } from 'path/to/your/store';

describe('updateOrder function', () => {
  beforeEach(() => {
    // Настраивает Pinia перед каждым тестом
    setActivePinia(createPinia());
  });

  it('should increment x if product is provided', () => {
    const store = useYourStore();
    // Предоставьте допустимый объект product
    store.updateOrder({ id: 1, name: 'Product A' });
    expect(store.order.value).toContainEqual({ id: 0 });
  });

  it('should decrement x if product is not provided', () => {
    const store = useYourStore();
    store.updateOrder(null);
    expect(store.order.value).toContainEqual({ id: -2 });
  });
});
```

С учётом тестирования кода с локальным хранилищем, вам нужно замокать `localStorage`. С помощью Vitest, это можно сделать таким образом:

```javascript
import { describe, it, expect, vi } from 'vitest';

// Замокайте объект localStorage
const localStorageMock = (function() {
  let store = {};
  return {
    getItem(key) {
      return store[key];
    },
    setItem(key, value) {
      store[key] = value.toString();
    },
    clear() {
      store = {};
    }
  };
})();

vi.stubGlobal('localStorage', localStorageMock);

// Дальше идут ваши тесты
describe('LocalStorage in store', () => {
  // Ваши юнит-тесты...
});
```

Вы должны убедиться, что ваш юнит-тест задействует локальное хранилище так, как это происходило бы в реальном сценарии использования, позволяя вам покрыть код в условии `if (orderLocalStorage) {...}`.
В общем я покрывал не все возможные сценарии и по этой причине coverage меня ругал, справедливо...
Похожие вопросы