Gatsby проекты тестирование

Gatsby — это популярный фреймворк для создания статических сайтов с использованием React. Его основное преимущество заключается в быстроте генерации страниц и возможности интеграции с множеством источников данных. Тестирование таких проектов является важной частью обеспечения качества и стабильности. В этом контексте React Testing Library является отличным инструментом для тестирования компонентов React, используемых в проектах Gatsby.

Особенности тестирования Gatsby проектов

При тестировании Gatsby проектов стоит учитывать несколько особенностей. Первый момент связан с тем, что Gatsby использует систему GraphQL для получения данных на этапе сборки. Следовательно, важно правильно настроить тестирование компонентов, которые зависят от данных, извлекаемых через GraphQL.

Кроме того, Gatsby активно использует концепции, такие как страницы и шаблоны. В отличие от обычных React-компонентов, страницы в Gatsby имеют свою специфику: они создаются в процессе сборки проекта и могут иметь разные параметры, такие как мета-теги или компоненты, зависящие от контекста.

Также стоит отметить, что Gatsby использует множество сторонних плагинов и библиотек, например, для обработки изображений, стилей и т.д. Все эти аспекты нужно учитывать при тестировании.

Настройка среды для тестирования Gatsby проектов

Для начала необходимо настроить среду для тестирования. Основными инструментами для этого являются Jest и React Testing Library. Jest предоставляет возможности для создания моков и настройки окружения, а React Testing Library — это библиотека для тестирования React-компонентов, ориентированная на тестирование их поведения, а не внутренней реализации.

Для использования React Testing Library в проекте на Gatsby необходимо установить несколько пакетов:

npm install --save-dev @testing-library/react @testing-library/jest-dom

Также важно установить jest и babel-jest, если они ещё не установлены:

npm install --save-dev jest babel-jest @babel/preset-env @babel/preset-react

После этого необходимо настроить Jest. В корне проекта следует создать файл jest.config.js с минимальной конфигурацией:

module.exports = {
  testEnvironment: 'jsdom',
  transform: {
    '^.+\\.[t|j]sx?$': 'babel-jest',
  },
};

Тестирование компонентов, зависящих от данных GraphQL

Один из ключевых аспектов тестирования Gatsby проектов — это работа с данными, получаемыми через GraphQL. Для тестирования компонентов, которые зависят от данных GraphQL, необходимо мокировать результаты запросов.

Допустим, компонент, который мы тестируем, использует данные, полученные через GraphQL-запрос. Пример такого компонента:

import React from 'react';
import { graphql } from 'gatsby';

const BlogPost = ({ data }) => {
  return (
    <div>
      <h1>{data.markdownRemark.frontmatter.title}</h1>
      <p>{data.markdownRemark.html}</p>
    </div>
  );
};

export const query = graphql`
  query {
    markdownRemark {
      frontmatter {
        title
      }
      html
    }
  }
`;

export default BlogPost;

Для того чтобы протестировать этот компонент с использованием моков, можно воспользоваться функцией gatsby-plugin-test для имитации данных, которые были бы получены из GraphQL.

Пример теста:

import React from 'react';
import { render } from '@testing-library/react';
import { StaticQuery } from 'gatsby';
import BlogPost from '../components/blog-post';

jest.mock('gatsby', () => ({
  ...jest.requireActual('gatsby'),
  StaticQuery: jest.fn(),
}));

describe('BlogPost', () => {
  it('renders the title and content', () => {
    StaticQuery.mockImplementationOnce(({ render }) =>
      render({
        markdownRemark: {
          frontmatter: {
            title: 'Test Blog Post',
          },
          html: '<p>Test content</p>',
        },
      })
    );

    const { getByText } = render(<BlogPost />);
    expect(getByText('Test Blog Post')).toBeInTheDocument();
    expect(getByText('Test content')).toBeInTheDocument();
  });
});

В этом примере используется StaticQuery, так как он часто применяется в Gatsby для выполнения запросов к данным. Мы мокуем его, чтобы вернуть нужные данные для компонента. render из React Testing Library позволяет проверить, что данные корректно отображаются на странице.

Тестирование страниц Gatsby

Тестирование страниц в Gatsby также имеет свои особенности. Страницы генерируются во время сборки, и они обычно зависят от конфигурации и данных, получаемых через GraphQL. Важно помнить, что тесты для страниц должны включать как рендеринг, так и проверку маршрутизации.

Пример страницы:

import React from 'react';
import { graphql } from 'gatsby';

const Page = ({ data }) => (
  <div>
    <h1>{data.site.siteMetadata.title}</h1>
  </div>
);

export const query = graphql`
  query {
    site {
      siteMetadata {
        title
      }
    }
  }
`;

export default Page;

Для тестирования этой страницы необходимо мокировать запросы GraphQL, а также проверить, что компонент рендерится правильно. Можно использовать аналогичный подход, как в тестировании компонентов, с настройкой мока для GraphQL.

Пример теста для страницы:

import React from 'react';
import { render } from '@testing-library/react';
import { StaticQuery } from 'gatsby';
import Page from '../pages/index';

jest.mock('gatsby', () => ({
  ...jest.requireActual('gatsby'),
  StaticQuery: jest.fn(),
}));

describe('Page', () => {
  it('renders the site title', () => {
    StaticQuery.mockImplementationOnce(({ render }) =>
      render({
        site: {
          siteMetadata: {
            title: 'Gatsby Site',
          },
        },
      })
    );

    const { getByText } = render(<Page />);
    expect(getByText('Gatsby Site')).toBeInTheDocument();
  });
});

Этот тест проверяет рендеринг страницы и отображение заголовка сайта, который возвращается через GraphQL-запрос.

Мокирование плагинов и сторонних библиотек

Многие Gatsby проекты используют плагины для обработки изображений, стилей и других ресурсов. При тестировании компонентов, которые используют такие плагины, необходимо мокировать их поведение. Например, плагин для обработки изображений может возвращать путь к изображению, а не сам файл.

Пример компонента, который использует плагин для обработки изображений:

import React from 'react';
import { StaticQuery, graphql } from 'gatsby';

const ImageComponent = ({ data }) => {
  const image = data.file.childImageSharp.gatsbyImageData;
  return <img src={image.images.fallback.src} alt="Test Image" />;
};

export const query = graphql`
  query {
    file(relativePath: { eq: "test.jpg" }) {
      childImageSharp {
        gatsbyImageData(width: 600)
      }
    }
  }
`;

export default ImageComponent;

Для тестирования такого компонента необходимо замокировать данные, которые предоставляет плагин, и проверить, что компонент рендерится с правильным изображением.

import React from 'react';
import { render } from '@testing-library/react';
import { StaticQuery } from 'gatsby';
import ImageComponent from '../components/image-component';

jest.mock('gatsby', () => ({
  ...jest.requireActual('gatsby'),
  StaticQuery: jest.fn(),
}));

describe('ImageComponent', () => {
  it('renders image with correct src', () => {
    StaticQuery.mockImplementationOnce(({ render }) =>
      render({
        file: {
          childImageSharp: {
            gatsbyImageData: {
              images: {
                fallback: {
                  src: '/path/to/image.jpg',
                },
              },
            },
          },
        },
      })
    );

    const { getByAltText } = render(<ImageComponent />);
    const img = getByAltText('Test Image');
    expect(img).toHaveAttribute('src', '/path/to/image.jpg');
  });
});

Заключение

Тестирование проектов Gatsby с использованием React Testing Library требует настройки правильного окружения и внимательного подхода к мокированию данных и плагинов. Важно правильно тестировать компоненты, которые зависят от данных GraphQL, а также страницы и сторонние библиотеки, используемые в проекте. С учетом этих особенностей можно создать надежные и устойчивые тесты для Gatsby проектов.