Макет импортированного класса в машинописи с шуткой - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь использовать jest для насмешки над импортированным классом внутри класса машинописного текста, следующий код используется для основной программы (я удалил некоторый код из функций, но все равно должно быть понятно, что я пытаюсь сделать)

import * as SocketIO from "socket.io";

import {AuthenticatedDao} from "../../dao/authenticated.dao";

export default class AuthenticationService {
    private readonly _authenticatedDao: AuthenticatedDao = AuthenticatedDao.Instance;
    private readonly _io;

    constructor(socketIo: SocketIO.Server) {
        this._io = socketIo;
    }

    public authenticateUser(username: string, password: string, clientSocketId: string): void {
        this._authenticatedDao.authenticateUser(username, password).then((authenticatedUser) => {

        }).catch(rejected => {

        });
    }
}


import {createServer, Server} from 'http';
import * as express from 'express';
import * as socketIo from 'socket.io';
import {LogincredentialsDto} from "./models/dto/logincredentials.dto";
import {config} from './config/config';
import AuthenticationService from "./services/implementation/authentication.service";
import {Logger} from "./helperclasses/logger";
import {format} from "util";

export class ClassA {
    private readonly _configPort = config.socketServerPort;

    private readonly _logger: Logger = Logger.Instance;
    private _app: express.Application;
    private _server: Server;
    private _io: socketIo.Server;
    private _socketServerPort: string | number;
    private _authenticationService: AuthenticationService;


    constructor() {
        this.configure();
        this.socketListener();
    }

    private configure(): void {
        this._app = express();

        //this._server = createServer(config.sslCredentials, this._app);
        this._server = createServer(this._app);

        this._socketServerPort = process.env.PORT || this._configPort;
        this._io = socketIo(this._server);

        this._server.listen(this._socketServerPort, () => {
            this._logger.log(format('Server is running on port: %s', this._socketServerPort));
        });

        this._authenticationService = new AuthenticationService(this._io);
    }


    private socketListener(): void {
        this._io.on('connection', (client) => {
                client.on('authenticate', (loginCreds: LogincredentialsDto) => {
                    console.log(loginCreds.username, loginCreds.password, client.id);
                    this._authenticationService.authenticateUser(loginCreds.username, loginCreds.password, client.id);
                });
            }
        );
    }
}

Я пытаюсь смоделировать функцию «authenticateUser» в «AuthenticationService», вместо вызова нормального кода, я хочу смоделировать обещание.Я попытался использовать примеры, представленные в https://jestjs.io/docs/en/es6-class-mocks, но при попытке сделать следующее:

import AuthenticationService from '../src/services/implementation/authentication.service';
jest.mock('./services/implementation/authentication.service');

beforeEach(() => {
    AuthenticationService.mockClear();
});

it('test', () => {

    // mock.instances is available with automatic mocks:
    const authServerInstance = AuthenticationService.mock.instances[0];

я получаю эту ошибку: Ошибка: (62, 31) TS2339: свойство 'mock' несуществует в типе 'typeof AuthenticationService'.

Что я здесь не так делаю?Должен ли я издеваться над классом / функцией по-другому, поскольку он использует обещания?

1 Ответ

0 голосов
/ 28 ноября 2018

Issue

В наборе AuthenticationService отсутствует свойство mock, поэтому TypeScript выдает ошибку.


Подробности

jest.mock создает автоматический макет модуля, который «заменяет класс ES6 конструктором макета и заменяет все его методы на фиктивные функции, которые всегда возвращают undefined».

В этом случаеdefault экспорт authentication.service.ts является классом ES6, поэтому он заменяется конструктором-имитатором.

Конструктор-макет имеет свойство mock, но TypeScript не знает об этом и все еще обрабатывает AuthenticationService в качестве исходного типа.


Решение

Используйте jest.Mocked, чтобы сообщить TypeScript об изменениях при наборе текста, вызванных jest.mock:

import * as original from './services/implementation/authentication.service';  // import module
jest.mock('./services/implementation/authentication.service');

const mocked = original as jest.Mocked<typeof original>;  // Let TypeScript know mocked is an auto-mock of the module
const AuthenticationService = mocked.default;  // AuthenticationService has correct TypeScript typing

beforeEach(() => {
  AuthenticationService.mockClear();
});

it('test', () => {

    // mock.instances is available with automatic mocks:
    const authServerInstance = AuthenticationService.mock.instances[0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...