Привет ребята.

Я Нима HKH, (бэк и фронт)*end разработчик.

Эта статья является продолжением статьи: Как создать приложение для создания заметок с помощью React и localstorage — часть 2



Теперь я собираюсь написать несколько тестов для нашего приложения для создания заметок с помощью React и Localstorage.

При использовании CRA Jest уже установлен на нем. но мы установили библиотеку Enzyme и React Testing. эти две библиотеки тестирования предназначены для тестирования React и DOM, и сейчас нам не нужна тема.

Сначала нам нужно создать localStorage.test.js внутри каталога src/Utils.

beforeEach: это функция Jest, которая будет повторяться перед каждым тестом. что мы ожидаем в нашем тесте от этого метода, так это очищать локальное хранилище перед каждым тестом. поэтому нам нужно создать метод clearLocalStorage. этот метод будет использоваться и в других тестах, поэтому лучше экспортировать его из утилиты.

TestUtils.js: эта утилита поможет нам очистить LocalStorage, смоделировать поставщика состояния и обернуть им все компоненты в тестах.

import React from "react";
import { StateProvider } from "../statemanagement";
export function clearLocaStorage() {
  localStorage.clear();
}
export function IncludingProvider(props) {
  const initialState = {
    notes: [],
    modal: false,
    edit: null,
    show: null,
    showModal: false
  };
const reducer = (state, action) => {
    switch (action.type) {
      case "newNote":
        return {
          ...state,
          notes: action.notes
        };
      case "openModal":
        return {
          ...state,
          modal: action.modal,
          edit: action.edit
        };
      case "showMessage":
        return {
          ...state,
          showModal: action.showModal,
          show: action.show
        };
default:
        return state;
    }
  };
return (
    <StateProvider initialState={initialState} reducer={reducer}>
      {props.children}
    </StateProvider>
  );
}

Давай сделаем это :

Сначала мы должны создать наше тестовое тело.

describe("Test Locastorage functionality", () => {
  test("test insert note", () => {
    //first set the item
    LocalStorage.setNotes(JSON.stringify(object));
    //now check with normal localStorage
    const insertedLocalStorage = LocalStorage.get("notes");
expect(JSON.parse(insertedLocalStorage)).toEqual(object);
  });
})

Объект здесь не объявлен, поэтому мы должны объявить некоторые фиктивные элементы для нашего теста.

const object = {
  id: 123456789,
  message: "Testi Message",
  category: "Family",
  title: "Test Title",
  notebook: ""
};
const unExistsObject = {
  id: 123456780,
  message: "Testi Message",
  category: "Family",
  title: "Test Title",
  notebook: ""
};
const objects = [
  {
    id: 123456789,
    message: "Testi Message",
    category: "Family",
    title: "Test Title",
    notebook: ""
  },
  {
    id: 123456785,
    message: "Second Testi Message",
    category: "work",
    title: "Second Test Title",
    notebook: ""
  }
];
const HomeNoteBook = [
  {
    id: 23456789,
    message: "Home Message",
    category: "Family",
    title: "Test Title",
    notebook: "Home"
  },
  {
    id: 23456785,
    message: "Second Home Message",
    category: "work",
    title: "Second Test Title",
    notebook: "Home"
  }
];
const UniversityNoteBook = [
  {
    id: 23456789,
    message: "University Message",
    category: "Family",
    title: "Test Title",
    notebook: "University"
  },
  {
    id: 23456785,
    message: "Second University Message",
    category: "work",
    title: "Second Test Title",
    notebook: "University"
  }
];
const NoteNextMonth = [];

Эти объекты являются фиктивными элементами, которые мы хотим вставлять, удалять, обновлять, считать и перемещать.

Перед переменными нам нужна beforeEach функция.

import LocalStorage from "./localStorage";
import { clearLocaStorage } from "./TestUtils";
beforeEach(() => {
  clearLocaStorage();
});

Итак, наш код должен быть таким, как показано ниже:

import LocalStorage from "./localStorage";
import { clearLocaStorage } from "./TestUtils";
beforeEach(() => {
  clearLocaStorage();
});
const object = {
  id: 123456789,
  message: "Testi Message",
  category: "Family",
  title: "Test Title",
  notebook: ""
};
const unExistsObject = {
  id: 123456780,
  message: "Testi Message",
  category: "Family",
  title: "Test Title",
  notebook: ""
};
const objects = [
  {
    id: 123456789,
    message: "Testi Message",
    category: "Family",
    title: "Test Title",
    notebook: ""
  },
  {
    id: 123456785,
    message: "Second Testi Message",
    category: "work",
    title: "Second Test Title",
    notebook: ""
  }
];
const HomeNoteBook = [
  {
    id: 23456789,
    message: "Home Message",
    category: "Family",
    title: "Test Title",
    notebook: "Home"
  },
  {
    id: 23456785,
    message: "Second Home Message",
    category: "work",
    title: "Second Test Title",
    notebook: "Home"
  }
];
const UniversityNoteBook = [
  {
    id: 23456789,
    message: "University Message",
    category: "Family",
    title: "Test Title",
    notebook: "University"
  },
  {
    id: 23456785,
    message: "Second University Message",
    category: "work",
    title: "Second Test Title",
    notebook: "University"
  }
];
const NoteNextMonth = [];
describe("Test Locastorage functionality", () => {
  test("test insert note", () => {
    //first set the item
    LocalStorage.setNotes(JSON.stringify(object));
    //now check with normal localStorage
    const insertedLocalStorage = LocalStorage.get("notes");
expect(JSON.parse(insertedLocalStorage)).toEqual(object);
  });
});

describe: он просто описывает набор тестовых случаев, перечисляемых «тестовыми» функциями.

test: наш тест должен быть в test функции.

expect: expect получит значение, а затем функцию цепочки, чтобы подтвердить наше ожидание.

toEqual: это наше ожидаемое значение. мы ожидаем, что длина insertedLocalStorage равна длине object.

Теперь нам нужно написать наши тесты вот так.

Тест должен быть комплексным, и вы должны составить несколько сценариев. действительно, с помощью теста BDD вы можете объяснить этот сценарий и провести для него тест. но теперь мы используем Jest и нет теста BDD (а также cucumber.js).

Сложный пример — «обновить заметку с идентификатором 123456785».

test("update the note with id 123456785", () => {
    //first set Notes object
    LocalStorage.setNotes(JSON.stringify(objects));
//update the objects[1]
    let updateObject = objects[1];
updateObject.title = "Come On";
    updateObject.message = "It's Our Life";
    updateObject.category = "Friends";
const updatedObject = LocalStorage.updateId(123456785, updateObject);
    const updatedItem = LocalStorage.findId(123456785)[0];
    const unUpdatedItem = LocalStorage.findId(123456789)[0];
    //it must be equal to new values
    expect(updatedItem.message).toEqual("It's Our Life");
    expect(updatedItem.title).toEqual("Come On");
    expect(updatedItem.category).toEqual("Friends");
    expect(updatedItem.id).toEqual(123456785);
//it dont have to be equal to pervious object
    expect(updatedObject.message).not.toEqual(objects[1].message);
    expect(updatedObject.title).not.toEqual(objects[1].title);
    expect(updatedObject.category).not.toEqual(objects[1].category);
    expect(updatedObject.id).not.toEqual(objects[1].id);
//un Updated object must be the same as it was
    expect(unUpdatedItem.message).toEqual(objects[0].message);
    expect(unUpdatedItem.title).toEqual(objects[0].title);
    expect(unUpdatedItem.category).toEqual(objects[0].category);
    expect(unUpdatedItem.id).toEqual(objects[0].id);
  });

Когда вы тестируете функциональность, важно протестировать заявления об отказе от ответственности. теперь запустите npm run test, чтобы запустить сценарий Jest.

Следующий уровень: CI/CD и Dockerize проект React.