Есть ли в 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
.
Ох ... и весь этот подход может в любом случае быть совершенно неправым.