Definiendo la Tienda
Tipado Inicial
Partiremos dejando claro el tipo de información que manejaremos a continuación. Por lo que vamos a crear un archivo para tal definición.
📃types/todo.ts
export interface Todo {
id: string;
title: string;
done: boolean;
createdAt: Date;
updatedAt: Date;
}
export interface TodoState {
items: Todo[];
}
Tenga en cuenta que partimos definiendo el tipo Todo
el cual representa el objeto con las propiedadades de cada tarea. A su vez, definimos TodoState
cuya propiedad items
declarada es del tipo Todo[]
, en otras plalabras, se trata de un arreglo de tareas.
Crear un Bosquejo de la Tienda
Para definir tienda todo
empezaremos creando un bosquejo de la misma.
Primero importaremos el complemento pinia
y también importamos el tipo TodoState
para la declaración del state
.
📃stores/todo.ts
import { defineStore } from "pinia";
import type { TodoState } from "../types/todo"
const state = (): TodoState => ({
items: []
})
const getters = {}
const actions = {}
export const useTodoStore = defineStore('todoStore',{
state,
getters,
actions
})
Tenga en cuenta que hasta ahora solo tenemos una estructura básica de la tienda más el estado inicial de la misma. Ahora, vamos a probar si está funcionando.
Probar la Definición de la Tienda
Para probar si la tienda está definida es necesario crea una instancia de pinia y establecerla como activa. Por ello importamos setActivePinia y createPinia.
También importamos, los correspondientes métodos que aplicaremos en las pruebas:
Luego, finalizamos las importaciones con useTodoStore
.
📃stores/__tests__/todo.spec.ts
import { createPinia, setActivePinia } from "pinia"
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import { useTodoStore } from "../todo";
beforeAll(() => {
setActivePinia(createPinia())
})
describe("useTodoStore", () => {
let store: ReturnType<typeof useTodoStore>
beforeEach(() => {
store = useTodoStore()
})
afterEach(() => {
store.$reset()
})
it("should creates a store", () => {
expect(store).toBeDefined()
})
it("should initializes with empty items", () => {
expect(store.items).toStrictEqual([])
})
})
Tenga en cuenta que:
setActivePinia(createPinia())
se ejecutará antes de que cada prueba se ejecute.- Declaramos la variable
store
para ser usada en cada una de las pruebas. - La asignación de
useTodoStore()
alstore
se realizará en cada prueba. - Al finalizar cada prueba se ejecutará
store.$reset()
para resetear elstore
. - Además de probar que
store
está definido, también probamos questore.items
es un arreglo vacio.
Ahora ejecutamos las pruebas.
npm run test:unit
Y las pruebas pasan...
DEV /vue-todo-pinia-tdd/src
✓ stores/__tests__/todo.spec.ts (2)
Test Files 1 passed (1)
Tests 2 passed (2)
Start at 15:47:28
Duration 1.73s (transform 691ms, setup 1ms, collect 198ms, tests 10ms)
PASS Waiting for file changes...
press h to show help, press q to quit
Ahora vamos a las actions
...