【问题标题】:Jest: shared async code between test blocks笑话:在测试块之间共享异步代码
【发布时间】:2020-09-13 01:56:10
【问题描述】:

我有一些这样的测试代码:

test('Test', async () => {
  const someData = await setup()
  const actual = myFunc(someData.x)
  expect(actual.a).toEqual(someData.y)
  expect(actual.b).toEqual(someData.y)
  ... many more like this
}

我想将代码分成多个test 块(因为我什至无法为每个expect 语句添加描述消息)。

如果 Jest 支持异步 describe,我可以这样做:

describe('Some group of tests', async () => {
const someData = await setup()

test('Test1', async () => {
  const actual = myFunc(someData.x)
  expect(actual.a).toEqual(someData.y)
}

test('Test2', async () => {
  const actual = myFunc(someData.x)
  expect(actual.b).toEqual(someData.y)
}
})

我当然可以为每个测试复制设置调用,但这会大大降低测试速度(我正在那里填充 MongoDB)。

那么,我有什么办法可以用 Jest 改进我的测试结构?

【问题讨论】:

    标签: javascript jestjs


    【解决方案1】:

    describe 回调函数不应该是异步的,这是正确的。它为套件同步定义测试,其范围内的任何异步操作都将被丢弃。

    以前 Jasmine 和 Jest 允许使用常规函数和 this 访问通用测试上下文。此功能在 Jest 中已弃用;公共变量需要用户自定义。

    共享代码可以移动到内部使用beforeAllbeforeEach等的辅助函数中:

    const setupWithTestContext = (testContext = {}) => {
      beforeAll(async () => {
        const setupData = await setup();
        Object.assign(testContext, setupData);
      });
      return testContext; // sets up a new one or returns an existing
    });
    
    const anotherSetupWithTestContext = (testContext = {}) => {
      beforeEach(() => {
        testContext.foo = 0;
      });
      return testContext;
    });
    
    ...
    
    describe('Some group of tests', async () => {
        const sharedTestData = setupTestContext();
        // or
        // const sharedTestData = {}; setupTestContext(sharedTestData);
    
        anotherSetupWithTestContext(sharedTestData);
    
        test('Test1', async () => {
          // context is filled with data at this point
          const actual = myFunc(sharedTestData.x)
          ...
        }
        ...
    })
    

    【讨论】:

    • 感谢您的回复!但是我也可以从beforeAll 之类的方法中获取数据吗?在我的情况下,我正在创建新的 MongoDB 对象,我想让它们重新进入测试(这样我就可以在它们的 id 上使用例如资产)。
    • 哦,抱歉,我错过了变异 testContext 的诀窍!我喜欢它,太棒了,它为我解决了它!
    • 很高兴它有帮助。
    猜你喜欢
    • 2020-10-23
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多