0Pricing
React Academy · บทเรียน

Zustand DevTools และการทดสอบ Store

เชื่อมต่อกับ Redux DevTools ผ่านมิดเดิลแวร์ devtools และทดสอบแอ็กชันของ store โดยตรงแบบยูนิต

Zustand DevTools และการทดสอบ Store เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

ยินดีต้อนรับ

ในบทเรียนนี้ คุณจะเชื่อมต่อสโตร์ Zustand กับ Redux DevTools เพื่อแก้ไขข้อบกพร่องแบบย้อนเวลา และเขียนการทดสอบหน่วยสำหรับแอ็กชันของสโตร์โดยตรง

มิดเดิลแวร์ DevTools

ครอบสโตร์ด้วยมิดเดิลแวร์ DevTools เพื่อเชื่อมต่อกับส่วนขยายเบราว์เซอร์ Redux DevTools จากนั้นคุณจะตรวจสอบแอ็กชันและการเปลี่ยนแปลงสถานะทุกครั้งได้ในไทม์ไลน์ของ DevTools
import { create } from 'zustand';
import { devtools } from 'zustand/middleware';

const useStore = create(
  devtools(
    (set) => ({
      count: 0,
      increment: () => set(s => ({ count: s.count + 1 }), false, 'increment'),
    }),
    { name: 'CounterStore' }
  )
);

แอ็กชันที่มีชื่อใน DevTools

ส่งชื่อแอ็กชันเป็นอาร์กิวเมนต์ที่สามให้ set() (เมื่อใช้ DevTools) ป้ายกำกับนี้จะปรากฏในไทม์ไลน์ของ DevTools ทำให้ติดตามสิ่งที่เปลี่ยนแปลงได้ง่าย
set(s => ({ count: s.count + 1 }), false, 'counter/increment');
// Appears as 'counter/increment' in Redux DevTools

การรวม persist และ DevTools

เชื่อมมิดเดิลแวร์หลายตัวเข้าด้วยกัน โดยครอบ persist ไว้ภายใน DevTools เพื่อดูการเปลี่ยนแปลงสถานะทั้งหมด รวมถึงการเปลี่ยนแปลงจากการไฮเดรชันข้อมูลจากพื้นที่จัดเก็บใหม่
const useStore = create(
  devtools(
    persist(
      (set) => ({ /* ... */ }),
      { name: 'my-store' }
    ),
    { name: 'MyStore' }
  )
);

การทดสอบสโตร์ของ Zustand

สโตร์ของ Zustand เป็น JavaScript ธรรมดา คุณจึงทดสอบได้โดยตรงโดยไม่ต้องเรนเดอร์คอมโพเนนต์ React ใด ๆ ให้นำเข้าสโตร์แล้วเรียก getState() และ setState() ในการทดสอบของคุณ
import { useCounterStore } from './store';

beforeEach(() => useCounterStore.setState({ count: 0 }));

test('increment increases count', () => {
  useCounterStore.getState().increment();
  expect(useCounterStore.getState().count).toBe(1);
});

การรีเซ็ตสถานะระหว่างการทดสอบ

เรียก setState พร้อมค่าตั้งต้นภายใน beforeEach เพื่อรีเซ็ตสโตร์ระหว่างการทดสอบ และป้องกันไม่ให้สถานะรั่วไหลระหว่างกรณีทดสอบ
const initialState = { count: 0, user: null };

beforeEach(() => {
  useMyStore.setState(initialState);
});

การจำลองสโตร์ในการทดสอบคอมโพเนนต์

สำหรับการทดสอบคอมโพเนนต์ ให้จำลองฮุกของสโตร์ให้ส่งคืนค่าที่ควบคุมได้ วิธีนี้ช่วยให้คุณทดสอบการเรนเดอร์ของคอมโพเนนต์สำหรับสถานะสโตร์ที่แตกต่างกันได้โดยไม่ต้องใช้ตรรกะของสโตร์จริง
vi.mock('./useCounterStore', () => ({
  useCounterStore: vi.fn(() => ({ count: 5, increment: vi.fn() })),
}));

การทดสอบแอ็กชันแบบอะซิงโครนัส

จำลอง fetch ในการทดสอบ แล้วเรียกแอ็กชันแบบอะซิงโครนัสผ่าน getState() รอการทำงานแบบอะซิงโครนัสด้วย await จากนั้นตรวจสอบยืนยันสถานะที่อัปเดตแล้ว
global.fetch = vi.fn().mockResolvedValue({
  json: () => Promise.resolve({ id: 1, name: 'Alice' }),
});

await useUserStore.getState().fetchUser(1);
expect(useUserStore.getState().user.name).toBe('Alice');

การป้องกัน DevTools ในโปรดักชัน

ปิดใช้ DevTools ในโปรดักชันโดยใช้มิดเดิลแวร์แบบมีเงื่อนไข เพื่อป้องกันไม่ให้ผู้ใช้เห็นโครงสร้างสโตร์ของคุณ
const isDev = process.env.NODE_ENV === 'development';

const useStore = create(
  isDev ? devtools(storeCreator, { name: 'App' }) : storeCreator
);

มิดเดิลแวร์การบันทึกข้อมูล

คุณสามารถเขียนมิดเดิลแวร์การบันทึกข้อมูลแบบกำหนดเองเพื่อบันทึกการเปลี่ยนแปลงสถานะทุกครั้งลงในคอนโซล ซึ่งมีประโยชน์เมื่อคุณไม่สามารถติดตั้งส่วนขยายเบราว์เซอร์ได้
const log = (fn) => (set, get, api) => fn(
  (args, replace, name) => {
    console.log('action', name, args);
    set(args, replace, name);
  }, get, api
);

ตรวจสอบความเข้าใจ

คุณจะรีเซ็ตสโตร์ Zustand ให้กลับสู่สถานะตั้งต้นระหว่างการทดสอบได้อย่างไร

สรุปทบทวน

เพิ่มมิดเดิลแวร์ DevTools และตั้งชื่อแอ็กชันเพื่อให้ไทม์ไลน์ของ DevTools อ่านง่าย ทดสอบสโตร์โดยตรงด้วย getState()/setState() โดยไม่ต้องเรนเดอร์คอมโพเนนต์ รีเซ็ตสถานะใน beforeEach เพื่อแยกการทดสอบออกจากกัน

จบหลักสูตร

ขอแสดงความยินดี! คุณเรียนจบ **การจัดการสถานะด้วย Zustand** แล้ว ตอนนี้คุณสามารถสร้างสโตร์ ใช้ตัวเลือก คงสถานะ แก้ไขข้อบกพร่องด้วย DevTools และเขียนการทดสอบหน่วยสำหรับตรรกะของสโตร์ได้

คำถามที่พบบ่อย

บทเรียน “Zustand DevTools และการทดสอบ Store” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Zustand DevTools และการทดสอบ Store” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Zustand DevTools และการทดสอบ Store”

เชื่อมต่อกับ Redux DevTools ผ่านมิดเดิลแวร์ devtools และทดสอบแอ็กชันของ store โดยตรงแบบยูนิต คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “Zustand DevTools และการทดสอบ Store” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสร้าง Zustand Store แรกของคุณ
  2. Selector และการป้องกันการเรนเดอร์ซ้ำโดยไม่จำเป็น
  3. การคงสถานะด้วยมิดเดิลแวร์ Persist
  4. Zustand DevTools และการทดสอบ Store
← กลับไปที่ React Academy