打字稿中的模拟功能

时间:2018-07-13 13:49:47

标签: typescript mocking mocha sinon

我要模拟以下代码:

const P = {
    scripts: {
        getScripts: (name?: any) => {
            // do some stuff and return json
            return { foo: 'value'};
        }
    }
}
export default P;

我需要测试的代码:

export const getScripts = (name?: string) => {
   return P.scripts.getScripts(name); // I want a mock being called here
};

我设法使用sinonJS进行测试:

const fakeGetScript = sinon.fake.returns({
    foo: 'fakeValue'
});

但是我不知道如何用伪造品来代替getScript的原始P

有什么主意吗?

3 个答案:

答案 0 :(得分:0)

在这种情况下,您需要拦截正在导入的模块的创建。诗乃不能做到这一点。一种实现此目的的方法是通过proxyquire库。

它会变成这样:

const proxyquire =  require('proxyquire');
const fakeGetScript = sinon.fake.returns({
    foo: 'fakeValue'
});
const p = proxyquire('./path/to/p', {
  scripts: {
    getScripts: fakeGetScript
  }
});

然后,您可以按预期在fakeGetScript上运行断言。

答案 1 :(得分:0)

您为什么不通过P作为协作者来简化模拟,而不是用 proxyquire 拦截require

export const getScripts = (name?: string, P) => {
   return P.scripts.getScripts(name); // I want a mock being called here
};

// Test
const fakeGetScript = () => ({ foo: 'value' });
const P = { scripts: { getScripts: fakeGetScript } };

expect(getScripts('aName', P)).toEqual({ foo: 'value' });

答案 2 :(得分:0)

Proxyquire很不错,但是它不维护您的打字稿类型。 ts-mock-imports是一个专为用伪造品代替进口商品而设计的库,它建立在sinon之上。这也是安全类型。