logologo
Começar
Manual
Desenvolvimento
Plugins
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
Começar
Manual
Desenvolvimento
Plugins
API
logologo

Início rápido

Visão geral do desenvolvimento de plugins
Escrever o primeiro plugin
Estrutura de diretórios do projeto

Desenvolvimento do lado do servidor

Visão Geral
Plugin
Collections (Tabelas de dados)
Database (Operações de banco de dados)
DataSourceManager (Gerenciamento de fontes de dados)
ResourceManager (Gerenciamento de recursos)
ACL (Controle de acesso)
Middleware
Cache
Event (Evento)
Context (Contexto da requisição)
Migration (Script de atualização)
Logger (Log)
I18n (Internacionalização)
Command (Linha de comando)
CronJobManager (Gerenciamento de tarefas agendadas)
Test (Teste)

Desenvolvimento do lado do cliente

Visão Geral
Plugin
Context (Contexto)
Router (Rotas)
ACL (Controle de acesso)
DataSourceManager (Gerenciamento de fontes de dados)
Resource (Recurso)
Request (Requisição)
Estilos e temas
Logger (Log)
I18n (Internacionalização)
Test (Teste)

Outros

Guia de atualização de plugins
Lista de idiomas
Gerenciamento de dependências
Build
Previous PageCronJobManager (Gerenciamento de tarefas agendadas)
Next PageVisão Geral
Aviso de tradução por IA

Esta documentação foi traduzida automaticamente por IA.

#Testes

NocoBase oferece um conjunto completo de ferramentas de teste para ajudar desenvolvedores a verificar rapidamente a correção da lógica do banco de dados, interfaces de API e implementações de funcionalidades durante o desenvolvimento de plugins. Este guia mostrará como escrever, executar e organizar esses testes.

#Por que escrever testes

Benefícios de escrever testes automatizados no desenvolvimento de plugins:

  • Verificar rapidamente se os modelos de banco de dados, APIs e lógica de negócios estão corretos
  • Evitar erros de regressão (detectar automaticamente a compatibilidade do plugin após atualizações do core)
  • Suportar ambientes de integração contínua (CI) para executar testes automaticamente
  • Suportar o teste de funcionalidades de plugins sem iniciar o serviço completo

#Fundamentos do Ambiente de Teste

NocoBase oferece duas ferramentas de teste essenciais:

FerramentaDescriçãoFinalidade
createMockDatabaseCria uma instância de banco de dados em memóriaTesta modelos e lógica de banco de dados
createMockServerCria uma instância completa da aplicação (inclui banco de dados, plugins, APIs, etc.)Testa processos de negócios e comportamento de interfaces

#Usando createMockDatabase para Testes de Banco de Dados

createMockDatabase é ideal para testar funcionalidades diretamente relacionadas a bancos de dados, como definições de modelos, tipos de campo, relacionamentos, operações CRUD, etc.

#Exemplo Básico

import { createMockDatabase, Database } from '@nocobase/database';

describe('Database test', () => {
  let db: Database;

  beforeEach(async () => {
    db = await createMockDatabase();
    await db.clean({ drop: true });
  });

  afterEach(async () => {
    await db.close();
  });

  it('should create and query data', async () => {
    const User = db.collection({
      name: 'users',
      fields: [
        { type: 'string', name: 'username' },
        { type: 'integer', name: 'age' },
      ],
    });

    await User.sync();

    const user = await db.getRepository('users').create({
      values: { username: 'testuser', age: 25 },
    });

    const found = await db.getRepository('users').findOne({
      filter: { username: 'testuser' },
    });

    expect(found.get('age')).toBe(25);
  });
});

#Testando Operações CRUD

const Posts = db.collection({
  name: 'posts',
  fields: [{ type: 'string', name: 'title' }],
});
await db.sync();

// Criar
const post = await db.getRepository('posts').create({ values: { title: 'Initial Title' } });
expect(post.get('title')).toBe('Initial Title');

// Atualizar
await db.getRepository('posts').update({
  filterByTk: post.get('id'),
  values: { title: 'Updated Title' },
});
const updated = await db.getRepository('posts').findOne({ filterByTk: post.get('id') });
expect(updated.get('title')).toBe('Updated Title');

#Testando Associações de Modelos

const Users = db.collection({
  name: 'users',
  fields: [
    { type: 'string', name: 'username' },
    { type: 'hasMany', name: 'posts' },
  ],
});

const Posts = db.collection({
  name: 'posts',
  fields: [
    { type: 'string', name: 'title' },
    { type: 'belongsTo', name: 'author' },
  ],
});
await db.sync();

const user = await db.getRepository('users').create({ values: { username: 'tester' } });
await db.getRepository('posts').create({
  values: { title: 'Post 1', authorId: user.get('id') },
});

const result = await db.getRepository('users').findOne({
  filterByTk: user.get('id'),
  appends: ['posts'],
});
expect(result.get('posts')).toHaveLength(1);

#Usando createMockServer para Testes de API

createMockServer cria automaticamente uma instância completa da aplicação, incluindo banco de dados, plugins e rotas de API, tornando-o ideal para testar interfaces de plugins.

#Exemplo Básico

import { createMockServer, MockServer } from '@nocobase/test';

describe('User API test', () => {
  let app: MockServer;

  beforeEach(async () => {
    app = await createMockServer({ plugins: ['users', 'auth'] });
  });

  afterEach(async () => {
    await app.destroy();
  });

  it('should create a user', async () => {
    const response = await app.agent()
      .post('/users:create')
      .send({ username: 'test', email: 'a@b.com', password: '123456' });

    expect(response.status).toBe(200);
    expect(response.body.username).toBe('test');
  });
});

#Testando Consultas e Atualizações de API

// Consultar lista de usuários
const list = await app.agent().get('/users:list');
expect(list.body.rows.length).toBeGreaterThan(0);

// Atualizar usuário
const update = await app.agent().post(`/users:update/${id}`).send({ username: 'newname' });
expect(update.body.username).toBe('newname');

#Simulando Status de Login ou Teste de Permissões

Você pode habilitar o plugin auth ao criar o MockServer, e então usar a interface de login para obter o token ou a sessão:

const res = await app
  .agent()
  .post('/auth:signin')
  .send({ 
    username: 'admin',
    password: 'admin123',
  });

const token = res.body.data.token;

await app
  .agent()
  .set('Authorization', `Bearer ${token}`)
  .get('/protected-endpoint');

Você também pode usar o método login() mais simples

await app.agent().login(userOrId);

#Organizando Arquivos de Teste em Plugins

Recomendamos armazenar os arquivos de teste relacionados à lógica do lado do servidor na pasta ./src/server/__tests__ do plugin.

packages/plugins/@my-project/plugin-hello/
├── src/                     # Diretório do código-fonte
│   └── server/              # Código do lado do servidor
│       ├── __tests__/       # Diretório de arquivos de teste
│       │   ├── db.test.ts   # Testes relacionados ao banco de dados (usando createMockDatabase)
│       │   └── api.test.ts  # Testes relacionados à API

#Executando Testes

# Especificar diretório
yarn test packages/plugins/@my-project/plugin-hello/src/server
# Especificar arquivo
yarn test packages/plugins/@my-project/plugin-hello/src/server/__tests__/db.test.ts