Переписать частные методы класса Typescript

#javascript #typescript #testing #mocha.js #rewire

#javascript #typescript #тестирование #mocha.js #переписать

Вопрос:

Я пытаюсь написать модульные тесты для некоторых частных методов в моем классе, используя Typescript для моего Node.js модуль. Я пытался использовать rewire , но он не может получить доступ к каким-либо методам (даже общедоступным). Вот моя настройка:

myclass.ts

 class MyClass{
    private somePrivateMethod() {
        // do something
        console.log(42);
    }

    public somePublicMethod() {
        // do something
        this.somePrivateMethod();
        // do something
    }
}

export default MyClass;
 

test.ts

 import { expect } from 'chai';
import rewire from 'rewire';


describe('Test', function () { 
    describe('#somePrivateMethod()', function () { 
        const rewired = rewire('../src/myclass.ts');
        //const rewired = rewire('../dist/myclass.js');
        
        const method = rewired.__get__('somePrivateMethod');
    });
});
 

Я попытался использовать rewire для файла Typescript, а также для скомпилированного JS-файла, но я получаю ту же ошибку:

 ReferenceError: somePrivateMethod is not defined
 

Я использую Mocha со следующей конфигурацией:

 'use strict';

module.exports = {
  extension: ["ts"],
  package: "./package.json",
  reporter: "spec",
  slow: 75,
  timeout: 2000,
  ui: "bdd",
  "watch-files": ["test/**/*.ts"],
  require: "ts-node/register",
};
 

Есть ли какое-нибудь решение этой проблемы?

Ответ №1:

Я знаю, что это довольно старый вопрос, но если кто-то еще окажется в такой ситуации, мне удалось найти решение:

 export class YourClass {
  constructor( ) { }
  
  private thisIsPrivate() {
    //private stuff
  }
  
  otherPublicMethod() {
    //public stuff
  }
}
 

внутри вашего тестового файла вы можете импортировать класс, как обычно, для тестирования общедоступных методов

 import YourClass from '../src/classes/YourClass'

const testClass = new YourClass();

...
 

для тестирования частных методов импортируйте класс с помощью rewire

 import rewire from 'rewire'

const rewiredModule = rewire('../src/classes/YourClass')

const rewiredClass = rewiredModule.__get__('YourClass')
 

затем внутри вашего теста

 it('Test your private method', function () {
  
   const myRewiredClassInstance = new rewiredClass()
   
   myRewiredClassInstance.thisIsPrivate()

   //do your expect here
}
 

Единственным недостатком является то, что возвращаемый объект является «любым», и поэтому typescript не помогает.

вы даже можете выполнять отладку внутри него, если правильно настроили свой отладчик

Всем приятного просмотра

Комментарии:

1. Если вы не знаете… вы можете «приводить» к типам: const datas = rewire_config.__get__('_Config_config_datas') as WeakMap<object, Map<string, ConfigData>>;

2. Но большим недостатком является то, что вам приходится использовать скомпилированный JS, и нет покрытия кода, обнаруженного для вызовов TS test framework.

3. Да, я знаю, что мы можем использовать приведение, но объект будет any, и мы заставляем его быть чем-то другим, поэтому, если модель функции, которую вы используете, изменится в будущем, тест все равно будет компилироваться, потому что он не знает, что это на самом деле.