如何使用Nest和Jest测试GRPC?

时间:2020-05-28 14:08:52

标签: jestjs grpc nestjs

我正在尝试测试GRPC方法,但是在Jest中运行时遇到此错误: TypeError:无法读取未定义的属性'gprcFindAll'

这是我参考的文档: https://docs.nestjs.com/microservices/grpc

这是我的控制者:

@Controller('benchmarks')
export class BenchmarksController {

    @GrpcMethod('HelloWorldGRPCService', 'findAll')
    async gprcFindAll(metadata?: any): Promise<Benchmarks[]> {
        const benchmarks = [];
        return benchmarks;
    }
}

这是我开玩笑的测试:

describe('Benchmarks Controller', () => {
    let controller: BenchmarksController;

    beforeEach(async () => {
        const module: TestingModule = await Test.createTestingModule({
            controllers: [BenchmarksController]
        }).compile();

        controller = module.get<BenchmarksController>(BenchmarksController);
    });

    it('should be defined', () => {
        expect(controller).toBeDefined();
    });

    it('GRPC Should Find All', async function() {
        const result = await controller.gprcFindAll();
        console.log(result);
    }); 
});

这是我的Proto 3文件:

syntax = "proto3";

package helloWorldGRPC;

service HelloWorldGRPCService {
    rpc findAll () returns (repeated Benchmarks);
}

message Benchmarks {
    string trans_id = 1;
    string protocol = 2;
    string database = 3;
    Timestamp updated_at = 4;
    Timestamp created_at = 5;
    repeated Action actions = 6;
}

message Action {
    string trans_id = 1;
    int32 payload_length = 2;
    string payload = 3;
    string status = 4;
    Timestamp updated_at = 5;
    Timestamp created_at = 6;
}

1 个答案:

答案 0 :(得分:0)

我知道这已经过时了,但我想我会回答如果来自谷歌的人遇到这个问题。

<块引用>

@GrpcMethod() 装饰器参数都是可选的。如果在没有第二个参数的情况下调用(例如,'FindOne'),Nest 将基于将处理程序名称转换为大驼峰大小写(例如,findOne 处理程序与 FindOne rpc 调用相关联)自动将 .proto 文件 rpc 方法与处理程序相关联定义)。如下所示。

它说它是未定义的,因为它是未定义的。它正在寻找 gprcFindAll 但是您已将方法 findAll 命名为第二个参数。

要么省略findAll

@GrpcMethod('HelloWorldGRPCService')
async gprcFindAll(metadata?: any): Promise<Benchmarks[]> {
    const benchmarks = [];
    return benchmarks;
}

或更改第二个参数以匹配处理程序

@GrpcMethod('HelloWorldGRPCService', 'GprcFindAll')
async gprcFindAll(metadata?: any): Promise<Benchmarks[]> {
    const benchmarks = [];
    return benchmarks;
}