nocobase/docs/zh-CN/development/server/test.md
2023-06-27 21:11:37 +08:00

167 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 测试
测试基于 [Jest](https://jestjs.io/) 测试框架。为了方便的编写测试,提供了 `mockDatabase()``mockServer()` 用于数据库和服务端应用的测试。
<Alert>
避免破坏生产环境数据,建议使用 `.env.test` 文件来配置测试环境的环境变量,并使用独立的测试数据库进行测试。
</Alert>
## `mockDatabase()`
默认提供一种完全隔离的 db 测试环境
```ts
import { mockDatabase } from '@nocobase/test';
describe('my db suite', () => {
let db;
beforeEach(async () => {
db = mockDatabase();
db.collection({
name: 'posts',
fields: [
{
type: 'string',
name: 'title',
}
]
});
await db.sync();
});
afterEach(async () => {
await db.close();
});
test('my case', async () => {
const repository = db.getRepository('posts');
const post = await repository.create({
values: {
title: 'hello'
}
});
expect(post.get('title')).toEqual('hello');
});
});
```
## `mockServer()`
提供模拟的服务端应用实例,对应的 app.db 为 `mockDatabase()` 实例,同时还提供了便捷的 `app.agent()` 用于测试 HTTP API针对 NocoBase 的 Resource Action 还封装了 `app.agent().resource()` 用于测试资源的 Action。
```ts
import { mockServer } from '@nocobase/test';
class MyPlugin extends Plugin {
}
describe('my suite', () => {
let app;
let agent;
beforeEach(async () => {
app = mockServer();
agent = app.agent();
// 添加待注册的插件
app.plugin(MyPlugin, { name: 'my-plugin' });
// 加载配置
app.load();
// 清空数据库并安装
app.install({ clean: true });
});
afterEach(async () => {
await app.destroy();
});
test('my case', async () => {
await agent.resource('posts').create({
values: {
title: 'hello'
}
});
await agent.get('/users:check').set({ Authorization: 'Bearer abc' });
});
});
```
## 示例
我们以之前在 [资源与操作](resources-actions) 章节的功能为例,来写一个插件的测试:
```ts
import { mockServer } from '@nocobase/test';
import Plugin from '../../src/server';
describe('shop actions', () => {
let app;
let agent;
let db;
beforeEach(async () => {
app = mockServer();
app.plugin(Plugin);
agent = app.agent();
db = app.db;
await app.load();
await db.sync();
});
afterEach(async () => {
await app.destroy();
});
test('product order case', async () => {
const { body: product } = await agent.resource('products').create({
values: {
title: 'iPhone 14 Pro',
price: 7999,
enabled: true,
inventory: 1
}
});
expect(product.data.price).toEqual(7999);
const { body: order } = await agent.resource('orders').create({
values: {
productId: product.data.id
}
});
expect(order.data.totalPrice).toEqual(7999);
expect(order.data.status).toEqual(0);
const { body: deliveredOrder } = await agent.resource('orders').deliver({
filterByTk: order.data.id,
values: {
provider: 'SF',
trackingNumber: '123456789'
}
});
expect(deliveredOrder.data.status).toBe(2);
expect(deliveredOrder.data.delivery.trackingNumber).toBe('123456789');
});
});
```
编写完成后,在命令行中允许测试命令:
```bash
yarn test packages/samples/shop-actions
```
该测试将验证:
1. 商品可以创建成功;
2. 订单可以创建成功;
3. 订单可以发货成功;
当然这只是个最基本的例子,从业务上来说并不完善,但作为示例已经可以说明整个测试的流程。
## 小结
本章涉及的示例代码整合在对应的包 [packages/samples/shop-actions](https://github.com/nocobase/nocobase/tree/main/packages/samples/shop-actions) 中,可以直接在本地运行,查看效果。