logologo
Empezar
Manual
Desarrollo
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
Empezar
Manual
Desarrollo
Plugins
API
logologo

Inicio rápido

Resumen de desarrollo de plugins
Escribir el primer plugin
Estructura de directorios del proyecto

Desarrollo del lado del servidor

Visión general
Plugin
Colecciones
Operaciones de base de datos
Gestión de fuentes de datos
Gestión de recursos
Control de permisos (ACL)
Middleware
Caché
Evento
Contexto de solicitud
Migración (Script de actualización)
Registro (Logger)
Internacionalización (I18n)
Línea de comandos (Command)
Gestión de tareas programadas
Pruebas

Desarrollo del lado del cliente

Visión general
Plugin
Contexto
Enrutador (Router)
Control de permisos (ACL)
Gestión de fuentes de datos
Recurso
Solicitud
Estilos y temas
Registro (Logger)
Internacionalización (I18n)
Pruebas

Otros

Guía de actualización de plugins
Lista de idiomas
Gestión de dependencias
Compilación
Previous PageGestión de tareas programadas
Next PageVisión general
Aviso de traducción por IA

Esta documentación ha sido traducida automáticamente por IA.

#Pruebas

NocoBase le ofrece un conjunto completo de herramientas de prueba para ayudarle a verificar rápidamente la lógica de la base de datos, las interfaces API y la correcta implementación de las funcionalidades durante el desarrollo de sus plugins. Esta guía le mostrará cómo escribir, ejecutar y organizar estas pruebas.

#¿Por qué escribir pruebas?

Beneficios de escribir pruebas automatizadas en el desarrollo de plugins:

  • Verifique rápidamente que los modelos de base de datos, las API y la lógica de negocio sean correctos.
  • Evite errores de regresión (detecte automáticamente la compatibilidad de los plugins después de las actualizaciones del núcleo).
  • Permita que los entornos de integración continua (CI) ejecuten pruebas automáticamente.
  • Pruebe la funcionalidad de los plugins sin necesidad de iniciar el servicio completo.

#Fundamentos del entorno de pruebas

NocoBase le proporciona dos herramientas de prueba principales:

HerramientaDescripciónPropósito
createMockDatabaseCrea una instancia de base de datos en memoriaPara probar modelos y lógica de base de datos
createMockServerCrea una instancia de aplicación completa (incluye base de datos, plugins, API, etc.)Para probar procesos de negocio y comportamiento de interfaces

#Uso de createMockDatabase para pruebas de base de datos

createMockDatabase es ideal para probar funcionalidades directamente relacionadas con las bases de datos, como definiciones de modelos, tipos de campos, relaciones, operaciones CRUD, etc.

#Ejemplo 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);
  });
});

#Pruebas de operaciones CRUD

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

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

// Update
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');

#Pruebas de asociaciones 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);

#Uso de createMockServer para pruebas de API

createMockServer crea automáticamente una instancia de aplicación completa que incluye base de datos, plugins y rutas de API, lo que la hace ideal para probar las interfaces de sus plugins.

#Ejemplo 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');
  });
});

#Pruebas de consultas y actualizaciones de API

// Query user list
const list = await app.agent().get('/users:list');
expect(list.body.rows.length).toBeGreaterThan(0);

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

#Simulación de estado de inicio de sesión o pruebas de permisos

Puede habilitar el plugin auth al crear MockServer y luego usar la interfaz de inicio de sesión para obtener un token o una sesión:

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');

También puede usar el método login() más simple:

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

#Organización de archivos de prueba en plugins

Le recomendamos almacenar los archivos de prueba relacionados con la lógica del lado del servidor en la carpeta ./src/server/__tests__ de su plugin.

packages/plugins/@my-project/plugin-hello/
├── src/                     # Directorio de código fuente
│   └── server/              # Código del lado del servidor
│       ├── __tests__/       # Directorio de archivos de prueba
│       │   ├── db.test.ts   # Pruebas relacionadas con la base de datos (usando createMockDatabase)
│       │   └── api.test.ts  # Pruebas relacionadas con la API

#Ejecución de pruebas

# Especificar directorio
yarn test packages/plugins/@my-project/plugin-hello/src/server
# Especificar archivo
yarn test packages/plugins/@my-project/plugin-hello/src/server/__tests__/db.test.ts