如何测试这种依赖性?

How to test this dependancy?

背景

我正在尝试测试一个简单的缓存模块,但我找不到在注入依赖项时保持 API 不变的方法。

代码

const myCache = () => {
    //this is a dependency. 
    //Ideally I would inject it ( a map already created), but if I do it, I will loose connect !
    let map; 

    const connect = url => {
        map = new Map();
       console.log(`This url ${url} exists for illustration purposes only!`);
    };

    const get = key => {
        console.log(`You requested an object with key: ${key}`);
        return map.get(key);
    };


    const set = ( key, value ) => {
        ma.set(key, value);
        console.log(`You want to save value ${value} with key ${key}`);
    };

    return {
        connect,
        get,
        set
    };
};

module.exports.myCache =  myCache;

这是一个使用地图的简单缓存模块,用于演示目的。 在此示例中,我有一个变量 map,它是在我调用 connect 时分配的。

问题

这里的问题是我需要知道是否使用正确的参数调用 map 中的方法 getset

因为地图是在 运行 connect 之后设置的,所以我无法监视它(例如使用 sinonjs)。一个可能的解决方案是将地图内置到 myCache 中,但随后 API 会发生变化,这是我想避免的。

问题

我如何测试在不更改此模块的 API 的情况下使用正确的参数调用 map 中的方法?

您可以提供 Map 的 Mock 实现来跟踪和监视创建的 Map 对象。这将允许您在单元测试结束时检查创建了哪些映射以及对它们调用了什么。

I can't see a way to keep the API unchanged while injecting the dependencies.

您通常不会保持 API 不变。发生的情况是您 扩展 API 以允许更好的控制。

const connect = url => {
    map = new Map();
   console.log(`This url ${url} exists for illustration purposes only!`);
};

为了让客户端控制地图,我们创建了一个接受地图作为参数的函数的新版本

const connect_v2 = url, injected_map => {
    map = injected_map;
   console.log(`This url ${url} exists for illustration purposes only!`);
};

然后您可以通过让旧地图调用新地图来删除重复项,而不更改其 API

const connect = url => {
   connect_v2(url, new Map())
};

const connect_v2 = url, injected_map => {
   map = injected_map;
   console.log(`This url ${url} exists for illustration purposes only!`);
};