TSRpc 框架学习2----简单修改并写测试用例

上一篇创建了一个应用,并运行成功。接下来我们开始了解一下这个应用的结构,手动写一个小例子。

1. 了解项目结构

用VScode打开项目,可以看见以下的项目结构:
在这里插入图片描述

2. 后端部分

后端部分,我们主要修改的是红色 框住的部分
在这里插入图片描述
先把文件删掉,只保留下文件夹
在这里插入图片描述

我们要实现一个计算工资的例子:如 100 + 200 = 300

shared\protocols 目录下开始新建文件。
在这里插入图片描述
文件必须以Ptl开头,在文件中分别定义请求接口,和相应接口
请求接口:以Req开头
相应接口:以Res开头

这里定义好了数据类型,tsrpc框架可以直接帮你拦截掉,非定义的数据类型,而不用去担心数据转化的问题。

定义完毕后,就可以开始实现这个接口了。
我们会把实现,放在 api 这个文件夹下,你也可以直接使用命令来自动生成实现的文件。
使用命令 npm run proto
在这里插入图片描述
会生成一个 serviceProto.ts的文件,这个文件包含了所有的接口信息,是tsrpc运行时使用的文件。如接口的定义,输入输出的定义等信息。

import { ServiceProto } from 'tsrpc-proto';
import { ReqGetSalary, ResGetSalary } from './PtlGetSalary';

export interface ServiceType {
    api: {
        "GetSalary": {
            req: ReqGetSalary,
            res: ResGetSalary
        }
    },
    msg: {

    }
}

export const serviceProto: ServiceProto<ServiceType> = {
    "services": [
        {
            "id": 0,
            "name": "GetSalary",
            "type": "api"
        }
    ],
    "types": {
        "PtlGetSalary/ReqGetSalary": {
            "type": "Interface",
            "properties": [
                {
                    "id": 0,
                    "name": "salary1",
                    "type": {
                        "type": "Number"
                    }
                },
                {
                    "id": 1,
                    "name": "salary2",
                    "type": {
                        "type": "Number"
                    }
                }
            ]
        },
        "PtlGetSalary/ResGetSalary": {
            "type": "Interface",
            "properties": [
                {
                    "id": 0,
                    "name": "result",
                    "type": {
                        "type": "Number"
                    }
                }
            ]
        }
    }
};

生成这个文件之后,再输入命令 npm run api ,就可以生成接口的实现了
在这里插入图片描述
ApiGetSalary.ts的内容如下:

import { ApiCall } from "tsrpc";
import { ReqGetSalary, ResGetSalary } from "../shared/protocols/PtlGetSalary";

export default async function (call: ApiCall<ReqGetSalary, ResGetSalary>) {
    // TODO
    call.error('API Not Implemented');
}

在tsrpc中,所有的请求参数,和返回参数,都是通过异步函数call 来获取的。
这里检单实现一下加法,参数1加参数2,并把结果返回。

import { ApiCall } from "tsrpc";
import { ReqGetSalary, ResGetSalary } from "../shared/protocols/PtlGetSalary";

export default async function (call: ApiCall<ReqGetSalary, ResGetSalary>) {
    call.succ({
        result: call.req.salary1 + call.req.salary2
    });
}

注意:要把函数名加上,这里ApiGetSalary

import { ApiCall } from "tsrpc";
import { ReqGetSalary, ResGetSalary } from "../shared/protocols/PtlGetSalary";

export async function ApiGetSalary(call: ApiCall<ReqGetSalary, ResGetSalary>) {
    call.succ({
        result: call.req.salary1 + call.req.salary2
    });
}

3. 测试后端的接口

打开文件夹 /test/api/ 就会看见一个已经写好的测试文件 data.test.ts 把里面的内容删掉一部分,只保留以下

import assert from 'assert';
import { HttpClient, TsrpcError } from 'tsrpc';
import { serviceProto } from '../../src/shared/protocols/serviceProto';

// 1. EXECUTE `npm run dev` TO START A LOCAL DEV SERVER
// 2. EXECUTE `npm test` TO START UNIT TEST

describe('ApiGetData', function () {
     //创建一个客户端
    let client = new HttpClient(serviceProto, {
        // 本地测试,使用 HTTP 协议
        server: 'http://127.0.0.1:3000',
        // 显示日志,显示在console里面
        logger: console
    });
})

改为以下内容:测试我们写的GetSalary接口

import assert from 'assert';
import { HttpClient, TsrpcError } from 'tsrpc';
import { serviceProto } from '../../src/shared/protocols/serviceProto';

// 1. EXECUTE `npm run dev` TO START A LOCAL DEV SERVER
// 2. EXECUTE `npm test` TO START UNIT TEST

describe('ApiGetData', function () {
    //创建一个客户端
    let client = new HttpClient(serviceProto, {
        // 本地测试,使用 HTTP 协议
        server: 'http://127.0.0.1:3000',
        // 显示日志,显示在console里面
        logger: console
    });
    // 测试用例
    it('Success', async function () {
        // 1. 调用API
        let ret = await client.callApi('GetSalary', {
            salary1: 100,
            salary2: 200
        });

        if (!ret.isSucc) { 
            console.log(ret.err.message);
            return;
        }

        console.log(ret.res.result);
    })
})

改完之后,就可以进行测试了:
输入 命令 npm run test 运行测试用例
在这里插入图片描述
提示测试成功。

也可以使用assert 断言的方式进行测试

import assert from 'assert';
import { HttpClient, TsrpcError } from 'tsrpc';
import { serviceProto } from '../../src/shared/protocols/serviceProto';

// 1. EXECUTE `npm run dev` TO START A LOCAL DEV SERVER
// 2. EXECUTE `npm test` TO START UNIT TEST

describe('ApiGetData', function () {
    //创建一个客户端
    let client = new HttpClient(serviceProto, {
        // 本地测试,使用 HTTP 协议
        server: 'http://127.0.0.1:3000',
        // 显示日志,显示在console里面
        logger: console
    });
    // 测试用例
    it('Success', async function () {
        // 1. 调用API
        let ret = await client.callApi('GetSalary', {
            salary1: 100,
            salary2: 200
        });

        //使用断言方式测试
        assert.deepStrictEqual(ret, {
            isSucc: true,
            res: {
                result: 300
            }
        });
    })
})

使用断言时,必须先要启动后端服务,再运行测试

启动后端服务
再运行断言测试
断言测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值