如何使用虚拟数据测试自定义获取钩?

发布于 2025-01-22 03:52:46 字数 2189 浏览 4 评论 0原文

我有一个自定义的获取钩。它不是真正的提取过程。

这是一个植入示例。我想为此编写适当的测试。

这是伪API。

import { data } from './data';
import { IProduct } from '../common/types';

// pseudo API
export const getProducts = (): Promise<IProduct[]> => {
  return new Promise((resolve, reject) => {
    if (!data) {
      return setTimeout(() => reject(new Error('data not found')), 1000);
    }
    setTimeout(() => resolve(data), 1000);
  });
};

这是usefetch.ts

import { useEffect, useState } from 'react';
import { getProducts } from '../api/api';
import { IProduct } from '../common/types';

export const useFetch = () => {
  const [products, setProducts] = useState<IProduct[]>([]);
  const [categories, setCategories] = useState<string[]>([]);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState<unknown>(null);

  useEffect(() => {
    const fetchProducts = async () => {
      setLoading(true);
      try {
        const res = await getProducts();
        const categories = Array.from(new Set(res.map((r) => r.category)));
        setProducts(res);
        setCategories(categories);
      } catch (err) {
        setError(err);
      } finally {
        setLoading(false);
      }
    };

    fetchProducts();
  }, []);

  return { products, categories, loading, error };
};

这是usefeth.test.ts

import { renderHook } from '@testing-library/react-hooks';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { data } from '../api/data';

import { useFetch } from './useFetch';

const server = setupServer(
  rest.get('/api', (req, res, ctx) => {
    return res(ctx.json(data));
  })
);

beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());

test('gets the data', async () => {
  const { result, waitForNextUpdate } = renderHook(() => useFetch());

  await waitForNextUpdate();

  expect(result.current).toEqual(data);
});

如何为这种情况编写适当的测试?

我会收到收到的预期错误。

期望(收到).Toequal(预期)//深层平等

I have a custom fetch hook. It is not doing a real fetch process.

It's an implantation example. I want to write a proper test for it.

This is the pseudo API.

import { data } from './data';
import { IProduct } from '../common/types';

// pseudo API
export const getProducts = (): Promise<IProduct[]> => {
  return new Promise((resolve, reject) => {
    if (!data) {
      return setTimeout(() => reject(new Error('data not found')), 1000);
    }
    setTimeout(() => resolve(data), 1000);
  });
};

Here is the useFetch.ts

import { useEffect, useState } from 'react';
import { getProducts } from '../api/api';
import { IProduct } from '../common/types';

export const useFetch = () => {
  const [products, setProducts] = useState<IProduct[]>([]);
  const [categories, setCategories] = useState<string[]>([]);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState<unknown>(null);

  useEffect(() => {
    const fetchProducts = async () => {
      setLoading(true);
      try {
        const res = await getProducts();
        const categories = Array.from(new Set(res.map((r) => r.category)));
        setProducts(res);
        setCategories(categories);
      } catch (err) {
        setError(err);
      } finally {
        setLoading(false);
      }
    };

    fetchProducts();
  }, []);

  return { products, categories, loading, error };
};

Here is the useFetch.test.ts

import { renderHook } from '@testing-library/react-hooks';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { data } from '../api/data';

import { useFetch } from './useFetch';

const server = setupServer(
  rest.get('/api', (req, res, ctx) => {
    return res(ctx.json(data));
  })
);

beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());

test('gets the data', async () => {
  const { result, waitForNextUpdate } = renderHook(() => useFetch());

  await waitForNextUpdate();

  expect(result.current).toEqual(data);
});

How can I write a proper test for this case?

I'm getting the received, expected error.

expect(received).toEqual(expected) // deep equality

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文