logologo
Start
Manual
Utveckling
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
Start
Manual
Utveckling
Plugins
API
logologo

Snabbstart

Översikt: Plugin-utveckling
Skriv ditt första plugin
Projektets katalogstruktur

Server-side-utveckling

Översikt
Plugin
Collections (datatabeller)
Database (databasåtgärder)
DataSourceManager (datakällshantering)
ResourceManager (resurshantering)
ACL (behörighetskontroll)
Middleware
Cache
Event (händelser)
Context (request-kontext)
Migration (uppgraderingsskript)
Logger (loggar)
I18n (internationalisering)
Command (kommandorad)
CronJobManager (schemalagda jobb)
Test (tester)

Klient-side-utveckling

Översikt
Plugin
Context (kontext)
Router (routing)
ACL (behörighetskontroll)
DataSourceManager (datakällshantering)
Resource (resurser)
Request (förfrågningar)
Stilar & teman
Logger (loggar)
I18n (internationalisering)
Test (tester)

Övrigt

Plugin-uppgraderingsguide
Språklista
Beroendehantering
Bygga
Previous PageCronJobManager (schemalagda jobb)
Next PageÖversikt
TIP

Detta dokument har översatts av AI. För eventuella felaktigheter, se den engelska versionen

#Test

NocoBase erbjuder en komplett uppsättning testverktyg som hjälper utvecklare att snabbt verifiera korrektheten i databaslogik, API-gränssnitt och funktionsimplementeringar under utvecklingen av en plugin. Den här guiden beskriver hur ni skriver, kör och organiserar dessa tester.

#Varför skriva tester?

Fördelarna med att skriva automatiserade tester vid plugin-utveckling:

  • Snabbt verifiera att databasmodeller, API:er och affärslogik är korrekta
  • Undvika regressionsfel (upptäcker automatiskt plugin-kompatibilitet efter uppgraderingar av kärnan)
  • Stödja att tester körs automatiskt i miljöer för kontinuerlig integration (CI)
  • Möjliggöra testning av plugin-funktionalitet utan att starta hela tjänsten

#Grundläggande testmiljö

NocoBase tillhandahåller två centrala testverktyg:

VerktygBeskrivningSyfte
createMockDatabaseSkapar en databasinstans i minnetTestar databasmodeller och logik
createMockServerSkapar en komplett applikationsinstans (inkluderar databas, plugin, API:er, etc.)Testar affärsprocesser och gränssnittsbeteende

#Använda createMockDatabase för databastestning

createMockDatabase är lämpligt för att testa funktionalitet som är direkt relaterad till databaser, såsom modelldefinitioner, fälttyper, relationer, CRUD-operationer med mera.

#Grundläggande exempel

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

#Testa CRUD-operationer

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

#Testa modellassociationer

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

#Använda createMockServer för API-testning

createMockServer skapar automatiskt en komplett applikationsinstans som inkluderar databas, plugin och API-vägar, vilket gör det idealiskt för att testa plugin-gränssnitt.

#Grundläggande exempel

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

#Testa API-frågor och uppdateringar

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

#Simulera inloggningsstatus eller behörighetstestning

Ni kan aktivera plugin-en auth när ni skapar MockServer, och sedan använda inloggningsgränssnittet för att få en token eller session:

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

Ni kan också använda den enklare metoden login()

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

#Organisera testfiler i plugin

Vi rekommenderar att ni lagrar testfiler relaterade till serverlogik i plugin-ens mapp ./src/server/__tests__.

packages/plugins/@my-project/plugin-hello/
├── src/                     # Source code directory
│   └── server/              # Server-side code
│       ├── __tests__/       # Test files directory
│       │   ├── db.test.ts   # Database related tests (using createMockDatabase)
│       │   └── api.test.ts  # API related tests

#Köra tester

# Specify directory
yarn test packages/plugins/@my-project/plugin-hello/src/server
# Specify file
yarn test packages/plugins/@my-project/plugin-hello/src/server/__tests__/db.test.ts