打字稿中的模拟功能
Mock function in typescript
我有以下代码可以模拟:
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'
});
但我不知道如何用我的假货替换 P
的原始 getScript
。
有什么想法吗?
在这种情况下,您需要拦截正在导入的模块的创建。诗乃做不到这一点。实现此目的的一种方法是通过 proxyquire 库。
它会是这样的:
const proxyquire = require('proxyquire');
const fakeGetScript = sinon.fake.returns({
foo: 'fakeValue'
});
const p = proxyquire('./path/to/p', {
scripts: {
getScripts: fakeGetScript
}
});
然后您可以运行您对 fakeGetScript 的断言如您所愿。
你为什么不通过 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' });
Proxyquire 很好,但它不会维护您的打字稿类型。 ts-mock-imports 是一个专门为用假货替换进口而设计的库,它建立在 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'
});
但我不知道如何用我的假货替换 P
的原始 getScript
。
有什么想法吗?
在这种情况下,您需要拦截正在导入的模块的创建。诗乃做不到这一点。实现此目的的一种方法是通过 proxyquire 库。
它会是这样的:
const proxyquire = require('proxyquire');
const fakeGetScript = sinon.fake.returns({
foo: 'fakeValue'
});
const p = proxyquire('./path/to/p', {
scripts: {
getScripts: fakeGetScript
}
});
然后您可以运行您对 fakeGetScript 的断言如您所愿。
你为什么不通过 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' });
Proxyquire 很好,但它不会维护您的打字稿类型。 ts-mock-imports 是一个专门为用假货替换进口而设计的库,它建立在 sinon 之上。它也是类型安全的。