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

Hızlı Başlangıç

Eklenti Geliştirmeye Genel Bakış
İlk Eklentinizi Yazma
Proje Dizin Yapısı

Sunucu Taraflı Geliştirme

Genel Bakış
Plugin
Collections
Database İşlemleri
DataSourceManager
ResourceManager
ACL İzin Kontrolü
Middleware
Cache
Event
Context
Migration
Logger
I18n
Command
CronJobManager
Test

İstemci Taraflı Geliştirme

Genel Bakış
Plugin
Context
Router
ACL İzin Kontrolü
DataSourceManager
Resource
Request
Styles & Themes
Logger
I18n
Test

Diğer

Eklenti Yükseltme Kılavuzu
Dil Listesi
Bağımlılık Yönetimi
Derleme
Previous PageCronJobManager
Next PageGenel Bakış
TIP

Bu belge AI tarafından çevrilmiştir. Herhangi bir yanlışlık için lütfen İngilizce sürümüne bakın

#Test

NocoBase, eklenti geliştirme sürecinde veritabanı mantığının, API arayüzlerinin ve özellik uygulamalarının doğruluğunu hızlıca doğrulamanıza yardımcı olacak eksiksiz bir test araçları seti sunar. Bu makale, bu testleri nasıl yazacağınızı, çalıştıracağınızı ve organize edeceğinizi anlatacaktır.

#Neden Test Yazmalıyız?

Eklenti geliştirirken otomatik testler yazmanın faydaları şunlardır:

  • Veritabanı modellerinin, API'lerin ve iş mantığının doğruluğunu hızla doğrulamanızı sağlar.
  • Regresyon hatalarını önler (çekirdek yükseltmelerinden sonra eklenti uyumluluğunu otomatik olarak algılar).
  • Sürekli entegrasyon (CI) ortamlarında testlerin otomatik olarak çalışmasını destekler.
  • Tam hizmeti başlatmadan eklenti işlevselliğini test etmenize olanak tanır.

#Test Ortamı Temelleri

NocoBase iki temel test aracı sunar:

AraçAçıklamaAmaç
createMockDatabaseBellek içi veritabanı örneği oluştururVeritabanı modellerini ve mantığını test etmek için
createMockServerTam bir uygulama örneği oluşturur (veritabanı, eklentiler, API'ler vb. dahil)İş süreçlerini ve arayüz davranışlarını test etmek için

#Veritabanı Testleri İçin createMockDatabase Kullanımı

createMockDatabase, model tanımları, alan türleri, ilişkiler, CRUD işlemleri gibi veritabanlarıyla doğrudan ilgili işlevleri test etmek için uygundur.

#Temel Örnek

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

#CRUD İşlemlerini Test Etme

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

#Model İlişkilerini Test Etme

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

#API Testleri İçin createMockServer Kullanımı

createMockServer, veritabanı, eklentiler ve API rotaları içeren eksiksiz bir uygulama örneğini otomatik olarak oluşturur ve bu da onu eklenti arayüzlerini test etmek için ideal kılar.

#Temel Örnek

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

#API Sorgularını ve Güncellemelerini Test Etme

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

#Oturum Açma Durumunu veya İzinleri Test Etme

MockServer oluştururken auth eklentisini etkinleştirebilir, ardından bir token veya oturum elde etmek için oturum açma arayüzünü kullanabilirsiniz:

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

Daha basit olan login() yöntemini de kullanabilirsiniz:

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

#Eklentilerde Test Dosyalarını Organize Etme

Sunucu tarafı mantığıyla ilgili test dosyalarını eklentinin ./src/server/__tests__ klasöründe saklamanız önerilir.

packages/plugins/@my-project/plugin-hello/
├── src/                     # Kaynak kodu dizini
│   └── server/              # Sunucu tarafı kodu
│       ├── __tests__/       # Test dosyaları dizini
│       │   ├── db.test.ts   # Veritabanı ile ilgili testler (createMockDatabase kullanarak)
│       │   └── api.test.ts  # API ile ilgili testler

#Testleri Çalıştırma

# Dizini belirtin
yarn test packages/plugins/@my-project/plugin-hello/src/server
# Dosyayı belirtin
yarn test packages/plugins/@my-project/plugin-hello/src/server/__tests__/db.test.ts