如何像描述和添加全局命令到Jest?

时间:2019-05-16 18:49:59

标签: javascript jestjs

我正在为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有setupFilesdescribe('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

1 个答案:

答案 0 :(得分:4)

将全局函数添加到Jest

要向玩笑添加全局功能,您需要在配置中定义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.todoassertTruthy.skipassertTruthy.onlyassertTruthy.eachcheck out the it interface )。 todoskip非常简单,因为您想做的和原始的完全一样。

对于eachonly,我们需要在实现中更改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,您可以跳过这一步。

之后,就像使用describeit一样使用它:

const funcToTest = (a: number, b: number) => a + b;

describe("Test Suite", () => {
  assertTruthy('this ran with assertTruthy', funcToTest, 5, 3);

  test("another test", () => {
    // ...
  });
});

并且开玩笑会将其视为其他任何it函数 jest run results

用作node_module依赖项

如果要从中创建一个库,基本上可以只将node_modules路径传递到setupFiles数组。

例如,对于this存储库,您可以执行以下操作:

  1. 使用npm install --save-dev @kibibit/jest-utils
  2. 进行安装
  3. 将以下内容添加到您的笑话配置
  4. 使用如上所述的功能
module.exports = {
  // ...
  setupFiles: ['node_modules/@kibibit/jest-utils/lib/jest-utils.js'],
  // ...
};

,它应该与本地导入相同。