可能是一个幼稚的问题,但是我有一个类似于(我的类有更多的数据从数据库读取并缓存它们):
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"
}
答案 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')
);