Модульное тестирование NodeJS - PullRequest
0 голосов
/ 17 июня 2019

Возможно, наивный вопрос, но у меня есть класс, аналогичный (у моего есть больше данных, прочитанных из базы данных и кэширующих их):

var genericClass = class {

    constructor() {
        this.genericStructure = {};
    }

    async getState(key) {
        //some more core logic
        return this.genericStructure[key];
    }

    async putState(key, genericJson) {
        this.genericStructure[key] = genericJson;
        return true;
    }
}

его getState и putState используются несколько раз впотребительский класс, я хочу высмеивать все эти события из локального map объекта в моем тестовом классе.Можно ли это сделать?

Я использую chai, mocha, sinon

"devDependencies": {
        "chai": "^4.1.2",
        "chai-as-promised": "^7.1.1",
        "eslint": "^4.19.1",
        "mocha": "^5.2.0",
        "nyc": "^12.0.2",
        "sinon": "^6.0.0",
        "sinon-chai": "^3.2.0"
    }

1 Ответ

1 голос
/ 17 июня 2019

Вместо того, чтобы позволить вашему классу инициализировать желаемую структуру, вы должны предоставить (внедрить) его структуру при инициализации.Это принцип Dependency Injection (Constructor инъекция).

var genericClass = class {

    constructor(initialStructure) {
        this.genericStructure = initialStructure;
    }

    async getState(key) {
        //some more core logic
        return this.genericStructure[key];
    }

    async putState(key, genericJson) {
        this.genericStructure[key] = genericJson;
        return true;
    }
}

И теперь в ваших тестах вы можете сдать все, что захотите, за initialStructure.

Обновленный ответ

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

function testClassProxy(map) {

    let handleSetProps = function(args){
      map.set(args[0], args[1]);
      return true;
    }

    let handleGetProps = function(args){
      return map.get(args[0]);
    }

    let handler = {
        get(target, propKey) {
            return function (...args) {
                switch(propKey){
                  case 'setProps':{
                    return handleSetProps(args)
                  } 
                  case 'getProps': {
                    return handleGetProps(args)
                  }
                }
            };
        }
    };

    return new Proxy(map, handler);
}


let proxy = testClassProxy(new Map());


console.log(
  proxy.setProps('a', '1'),
  proxy.getProps('a')
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...