Есть ли у шутки что-то вроде aroundEach? - PullRequest
0 голосов
/ 10 июля 2020

Есть ли в jest библиотеки тестирования что-то вроде aroundEach, которое присутствует в других библиотеках тестирования? Я не уверен, что его просто нет или я ищу не то. Я имею в виду то, что позволило бы мне написать такой код:

aroundEach(test => {
  console.log("Printed before each test")
  test() // Runs the actual test
  console.log("Printed after each test")
})

Например, это необходимо, чтобы иметь возможность писать код, который использует cls-hooked для запуска теста с определенным контекстом . Например:

import {createNamespace} from "cls-hooked"

aroundEach(test => {
  let context = createNamespace("context")
  context.run(() => {
    context.set("a_number", 123456)
    test() // Runs the actual test
  })
})

Вот пример того, как это сделать с помощью Ruby MiniTest: https://github.com/jeremyevans/minitest-hooks#around -hooks-

Вот руководство о том, как это сделано с помощью Rspe c in Ruby: https://spin.atomicobject.com/2013/03/24/using-the-rspec-around-hook/

В попытке выполнить эту работу я попытался создать свою собственную функцию wrappedTest для замены (и переноса) test, вот так:

function wrappedTest(name: string, fn?: ProvidesCallback, timeout?: number) {
  let wrappedFn = fn
  if (fn) {
    wrappedFn = (done) => {
      console.log("Before the test")
      fn(done)
      console.log("After the test")
    }
  }
  test(name, wrappedFn, timeout)
}

, а затем для моего теста я бы просто использовал wrappedTest вместо test:

wrappedTest("Example test", async () => {
  console.log("this is the actual test")
})

К сожалению, это не сработало. ошибка:

  console.log src/entity/User.test.ts:24
    Before the test

  console.log src/entity/User.test.ts:33
    this is the actual test

  console.log src/entity/User.test.ts:26
    After the test


: Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.

Я попытался добавить await, но это не имело значения:

function wrappedTest(name: string, fn?: ProvidesCallback, timeout?: number) {
  let wrappedFn = fn
  if (fn) {
    wrappedFn = async (done) => {
      console.log("Before the test")
      await fn(done)
      console.log("After the test")
    }
  }
  test(name, wrappedFn, timeout)
}

Если я назову done в моем реальном тесте, например:

wrappedTest("Example test", async (done) => {
  console.log("this is the actual test")
  done()
})

это работает, но это не обязательно, когда я использую test, поэтому я не понимаю, почему это необходимо при использовании wrappedTest.

Ох ... и весь этот подход может в любом случае быть совершенно неправым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...