Javascript Jasmine异步测试生成

Javascript Jasmine异步测试生成,javascript,jasmine,jestjs,Javascript,Jasmine,Jestjs,让我们想象一下,我们有一个承诺,可以执行大量操作并返回帮助函数。 一个平庸的例子: const testPromise=testFn=>()=>{ const helper=Promise.resolve({testHelper:()=>'an helper function'})//I/O承诺,返回用于测试的帮助程序 返回helper.then(testFn).finally(()=>console.log('teardown')); } //这个描述将如预期的那样工作 描述('异步测试方法'

让我们想象一下,我们有一个承诺,可以执行大量操作并返回帮助函数。 一个平庸的例子:

const testPromise=testFn=>()=>{
const helper=Promise.resolve({testHelper:()=>'an helper function'})//I/O承诺,返回用于测试的帮助程序
返回helper.then(testFn).finally(()=>console.log('teardown'));
}
//这个描述将如预期的那样工作
描述('异步测试方法',()=>{
它('A test',testPromise(异步({testHelper})=>{
expect(testHelper()).toBe('an helper function'))
}))
})
//这部分不行
descripe('Async descripe approach',testPromise(Async({testHelper})=>{
它('测试1',()=>{
expect(testHelper()).toBe('an helper function'))
})
它('测试2',()=>{
expect(testHelper()).not.toBe('椅子')
})
}))
}
我想要实现的是第二个示例,在这个示例中,我可以在descripe中使用异步代码,而无需重新评估
testPromise

descripe
不处理异步,所以我甚至不能正确地循环和创建动态测试

我确实读过很多评论,说
descripe
应该只是分组测试的一种简单方法,但是。。。然后。。。如何根据I/O结果进行异步生成的测试

谢谢

=额外考虑=

关于你们友好地添加的所有评论,我应该添加一些额外的细节

我很清楚,测试必须同步定义:),这正是问题开始的地方。我完全不同意这一点,我正试图找到一种替代方法,避免在不指定外部变量的情况下进行前后转换。在Jest的问题中,有一个公开的解决方案,看起来他们确实同意使用descripe async,但他们不会这么做。原因是。。。Jest正在使用Descripte的Jasmine实现,这个“修复”应该在那里完成

我想尽量避免在之前和之后。我的目的是创建一种简单(且简洁)的方法来定义根据我的需要定制的集成测试,而不让用户担心初始化和破坏周围的东西。我将继续使用上面的示例1样式,这对我来说似乎是最好的解决方案,即使这显然是一个较长的过程。

看一看。医生说:

必须同步定义测试,Jest才能收集测试

这是定义测试用例的原则。这意味着应该同步定义
it
函数。这就是为什么你的第二个例子不起作用

一些I/O操作应在
之前
之后
之前
之后
方法中完成,以准备测试双工和夹具。试验应尽可能与外部环境隔离

如果必须这样做,也许可以将动态获取的
testHelper
函数写入静态js文件,然后以同步方式对其进行测试。医生说:

必须同步定义测试,Jest才能收集测试

这是定义测试用例的原则。这意味着应该同步定义
it
函数。这就是为什么你的第二个例子不起作用

一些I/O操作应在
之前
之后
之前
之后
方法中完成,以准备测试双工和夹具。试验应尽可能与外部环境隔离


如果必须这样做,也许可以将动态获取的
testHelper
函数写入静态js文件,然后以同步方式对其进行测试,正如前面所述,
descripe
用于分组测试

这可以通过之前的
实现。由于以前的
应该以任何方式调用,因此可以将其移动到
testPromise

const prepareHelpers = (testFn) => {
  beforeAll(() => {
    ...
    return helper.then(testFn);
  })
}

describe('Async describe approach', () => {
  let testHelper;

  prepareHelpers(helpers => { testHelper = helpers.testHelper });
  ...

如前所述,
描述
用于分组测试

这可以通过之前的
实现。由于以前的
应该以任何方式调用,因此可以将其移动到
testPromise

const prepareHelpers = (testFn) => {
  beforeAll(() => {
    ...
    return helper.then(testFn);
  })
}

describe('Async describe approach', () => {
  let testHelper;

  prepareHelpers(helpers => { testHelper = helpers.testHelper });
  ...

为什么问题有两个标签?你问的是Jasmine还是Jest?Jest是用Jasmine的形容词。所以,据我所知,在这个具体的例子中,它们都是有效的。我本应该在没有使用之前或之后的情况下指定,我想要的是避免所有的熵和外部变量声明。在第一个案例中你显然没有提出的东西。我的问题是以一种优雅的方式做同样的事情,而不是在上面声明一个变量,在前面初始化它,然后在后面拆掉它。毕竟,使用before/after是我的第一个实现,但它并不整洁(我的意见),而且每个描述都必须重复使用它。如果您的案例是Jasmine,我建议坚持使用它。Jest有它自己的细节,在Jest中可以以不同的方式处理问题,有设置文件。这是特定于您使用的跑步者的,是什么?如果没有它,则需要在每个
描述中指定它。如果需要,您可以重写
description
,但这取决于您在testPromise中的具体操作。如果您将异步代码添加到所有不需要的套件中,这将降低测试运行的速度。我目前的方法是定义一个全局变量(在jest设置阶段),如“testPromise”(见上文)。所有东西都是我的项目内部的,并且是惰性地初始化的,我不需要从外部要求任何东西。它工作得很好。我想在不增加前后噪音的情况下让它变得更好,避免无用的冗余。即使。。。定义由afterAll/beforeAll创建/修改的外部变量是规范的方法。。。我觉得这是一种很有说服力的做法,而不是func