我正在为Jest写一个小的测试工具(仅供学习)。它称为itemdblclick: function (item, record, eOpts) {
var store = Ext.getStore('mystore');
var newStore = Ext.create('mycomponent.mystore', {
autoDestroy: true
});
var parentid = record.data.idelement;
var that = this;
newStore.proxy.extraParams = {
sort: 'clave',
'filter[active]': true,
'filter[idparent]' = parentid
};
newStore.load({
callback: function(items) {
var node = store.getRootNode().findChild('idelement', parentid, true);
if (node) {
for (var i = 0, l = items.length; i < l; i++) {
var item = items[i].data;
var child = {
idparent = parentid,
...
};
node.appendChild(child, true);
}
node.expand();
}
}
});
}
,需要一条消息,一个函数和一个参数,并且如果使用参数调用该函数时返回的内容为真,则应通过,否则返回false。
我想将其添加到Jest中,以便您可以调用它而无需在每个环境中导入它。
assertTruthy(msg, fn, args)
我知道Jest有setupFiles
和describe('someFn()', () => {
// like 'it', 'describe' and 'expect' it should just be available here
it('is a function', () => {
expect(typeop someFN).toEqual('Function');
});
assertTruthy('it should return true', someFn, 3, 4);
});
,但我不知道如何使用它们来实现这一目标。
如何向Jest添加命令?
PS:在单个项目(in CRA)上,我设法做到了这一点:
setupFilesAfterEnv
答案 0 :(得分:4)
要向玩笑添加全局功能,您需要在配置中定义setupFiles
并将该功能附加到安装文件中的全局对象:
module.exports = {
// ...
setupFiles: ['<rootDir>/setupFile.js'],
// ...
};
因此,如果您想做与it
非常相似的事情,我建议您做这样的事情:
// /setupFile.js
// in order to change an existing function (not youre case):
global.it = function(description, fn) { /* ... */ };
// this is how you define a new function globally
global.assertTruthy = (message, func, ...args) => {
return global.it(message, () => {
expect(func(...args)).toBeTruthy();
});
// optional: implementing the same interface as `jest.It`
jest.It
相同的界面这是 Airbnb 库airbnb/jest-wrap
中的示例,他们在其中包装了describe函数。如果要实现jest.It
接口,则还需要实现assertTruthy.todo
,assertTruthy.skip
,assertTruthy.only
和assertTruthy.each
(check out the it
interface )。 todo
和skip
非常简单,因为您想做的和原始的完全一样。
对于each
和only
,我们需要在实现中更改it
函数。支持only
的简单方法是使用闭包,并从闭包的inpu传递正确的it
函数。 each
的实现可能会稍微复杂一些。
// /setupFile.js
// normaly, use the jest `it` function
global.assertTruthy = assertTruthyCreator(it);
// bypass for todo and skip
global.assertTruthy.todo = global.it.todo;
global.assertTruthy.skip = global.it.skip;
// only calls the same function but uses `only` internaly
global.assertTruthy.only = assertTruthyCreator(it.only);
// special case which needs special implementation
// see usage below
global.assertTruthy.each = assertTruthyCreator(it.each, true);
function assertTruthyCreator(itFunc, withTable) {
if (withTable) {
return (message, func, ...args) => {
return itFunc(args)(message, (...caseArgs) => {
expect(func(...caseArgs)).toBeTruthy();
});
};
}
return (message, func, ...args) => {
return itFunc(message, () => {
expect(func(...args)).toBeTruthy();
});
};
}
// usage:
assertTruthy.each(
'add numbers',
(a, b) => a + b,
[2, 4],
[4, 5],
[7, 9]);
如果您使用打字稿编写笑话测试,那么您要做的第一件事就是declare
某个地方的新功能:
interface IGenericFunction {
(...args: any[]): any;
}
declare const assertTruthy: (message: string, func: IGenericFunction, ...args: any[]) => any;
使用javascript,您可以跳过这一步。
之后,就像使用describe
和it
一样使用它:
const funcToTest = (a: number, b: number) => a + b;
describe("Test Suite", () => {
assertTruthy('this ran with assertTruthy', funcToTest, 5, 3);
test("another test", () => {
// ...
});
});
node_module
依赖项如果要从中创建一个库,基本上可以只将node_modules
路径传递到setupFiles
数组。
例如,对于this存储库,您可以执行以下操作:
npm install --save-dev @kibibit/jest-utils
module.exports = {
// ...
setupFiles: ['node_modules/@kibibit/jest-utils/lib/jest-utils.js'],
// ...
};
,它应该与本地导入相同。