NodeJS单元测试

时间:2019-06-17 05:06:23

标签: node.js unit-testing mocha sinon

可能是一个幼稚的问题,但是我有一个类似于(我的类有更多的数据从数据库读取并缓存它们):

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;
    }
}

它的getStateputState在使用者类中被多次使用,我想从我的测试类中的本地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 个答案:

答案 0 :(得分:1)

与其让类初始化所需的结构,不如在初始化时为其提供(注入)结构。这就是依赖注入(构造函数注入)的原理。

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')
);