Гнездо JS, SuperTest - гнездо не получает событие - PullRequest
0 голосов
/ 26 марта 2020

Я борюсь с тестом e2e о своем сокете.

Сокет хорошо подключается и регистрируется в шлюзе Nest JS, но он не входит в мой слушатель bedRequest.

Мой тест состоит из отправки запроса на создание с помощью супер-теста, и в конце шлюз передает сообщение на подключенные сокеты, и я хочу его проверить.

В журналах шлюза я вижу, что клиент подключен, вход в систему и отключается, если это может помочь.

Заранее благодарим.

 it("/POST bedRequest", (done) => {
        let bedRequestCreate = some payload
        let expectedResult = other payload

        const address = app.getHttpServer().listen().address();
        const baseAddress = `http://[${address.address}]:${address.port}`;
        const client = io(`${baseAddress}/`);

        client.on("connect", () => { // this works
            client.emit("logIn", {access_token: accessToken}, (isConnected) => {
                expect(isConnected).toBeTruthy(); // this works

                client.on("bedRequest", (data) => { // this doesn't work
                    expect(JSON.parse(data)).toMatchObject({
                        siteId: bedRequestCreate.siteId,
                        ...expectedResult
                    });
                    done();
                });
            });
        });

        return request(app.getHttpServer())
            .post("/api/bedRequest/")
            .send(bedRequestCreate)
            .set('Accept', 'application/json')
            .set('Authorization', 'Bearer ' + accessToken)
            .expect('Content-Type', /json/)
            .expect(201)
            .end((err, res) => {
                if (err) return done(err);
                expect(res.body.generatedMaps[0]).toMatchObject(expectedResult); // this works
            });
    });

Шлюз:

@WebSocketGateway()
export class SocketGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {

    @WebSocketServer() server: Server;

    wsClients = [];

    private logger: Logger = new Logger('SocketGateway');

    handleDisconnect(client: Client) {
        for (let i = 0; i < this.wsClients.length; i++) {
            if (this.wsClients[i] === client) {
                this.wsClients.splice(i, 1);
                break;
            }
        }
        this.logger.log(`Client disconnected: ${client.id}`);
    }

    broadcast(event: String, message: any) {
        const broadCastMessage = JSON.stringify(message);
        for (let c of this.wsClients) { // sends to the right client
            c.send(event, broadCastMessage);
        }
    }

    @UseGuards(WebSocketJwtAuthGuard)
    @SubscribeMessage("logIn")
    handleLogIn(client) { // works
        this.logger.log(`Socket Client connected : ${client.id} for user ${client.user.id} / ${client.mail}`);
        this.wsClients.push(client);
        return true;
    }

    handleConnection(client) {
        return `Client connected: ${client.id}`;
    }

    afterInit() {
        this.logger.log("SocketGateway initialized")
    }

}

1 Ответ

0 голосов
/ 26 марта 2020

Хорошо, я нашел это ...

Это было из-за этой строки: c.send(event, broadCastMessage);

Я изменил send на emit, и он отлично работает.

...