如何避免Jest警告:"describe"回调函数不能返回值?

11

将Jest从23版本升级到24版本后,运行我的测试时,几乎每个测试都会收到如下警告信息:

"describe"回调函数不应返回值。 从“describe”返回值将在Jest的将来版本中导致测试失败。

相关的堆栈跟踪指向这个模块:

addSpecsToSuite (node_modules/jest-jasmine2/build/jasmine/Env.js:443:15)
这是因为我喜欢在测试中使用箭头函数的简写版本,当函数体只包含一个语句时,省略大括号。例如:

The reason for this is that I like to use the short-hand version of arrow-functions for my tests, omitting curly braces when the function body contains only one statement, for example:

describe('true', () =>
    it('should be truthy', () =>
        expect(true).toBeTruthy()));

“it”语句显然返回的是除了“undefined”之外的一些内容,因此出现了警告。

我找到了两种修复方法:

①不要使用箭头函数的简写形式

describe('true', () => {
    it('should be truthy', () =>
        expect(true).toBeTruthy());
});

② 使用 void 强制返回 undefined

describe('true', () =>
    void it('should be truthy', () =>
        expect(true).toBeTruthy()));

我发现这两个选项都不可接受,我不想为了让 Jest(或 Jasmine)满意而重新设计成千上万的测试用例。

所以我的问题是:

有没有一种方法可以配置 Jest,使得使用简写箭头函数时不会发出这些警告?


2
除了个人喜好之外,您需要使用简写语法的特定原因吗?这似乎可以通过添加大括号来完全解决。 - Alexander Staroselsky
1
个人偏好,我只是习惯了它,并且喜欢简洁的语法。 - Patrick Hund
1
无论我的describe()是否使用简写箭头函数,我一直收到相同的警告,但堆栈跟踪略有不同。原来这是PhpStorm中的一个错误,在v2018.3.6中将得到解决。可以在此处找到解决方法:https://intellij-support.jetbrains.com/hc/en-us/community/posts/360003251559-Error-running-tests-from-editor-with-jest-24-?flash_digest=8da09960025d1b74d6145c5f718bba3268ccddba - urig
当您在一个describe中嵌套另一个describe时,也会发生这种情况。这些更改是错误的。如果我有时间,我会在repo上报告此问题。 - lonix
@Ionix嗯,他们提供详细的废弃警告事实使它看起来不像是个漏洞,而是一个特性。 - Patrick Hund
3个回答

6

我猜如果你真的想保持现有的测试语法,只是想避免警告,那么你可以这样做:

const realDescribe = describe;
describe = ((name, fn) => { realDescribe(name, () => { fn(); }); });

只需将该代码添加到一个包含在您的setupFilesAfterEnv中的模块中,它将在测试框架安装在环境中之后立即运行,并在每个测试之前运行。
上面的代码将全局变量describe设置为一个函数,该函数调用真正的describe,但将function参数包装在一个匿名函数中,该匿名函数不返回任何内容。

4
如果你正在使用 Jest v24 不认识的全局函数,也会出现这个问题。我将一些 Mocha 测试转换为 Jest,但 Mocha 的 before() 抛出了相同的错误:

"describe" 回调函数不应返回任何值。从 "describe" 返回值将在 Jest 的未来版本中导致测试失败。

堆栈跟踪指向 describe() 是罪魁祸首,但解决方法是将嵌套的 before() 调用转换为 Jest 兼容的 beforeAll()。可能还存在一个相关问题,尝试使用 it() 替代 test(),但这可能需要掌握技巧,因为 Jest 的测试环境中肯定有 it()

0

可能与在描述回调函数中抛出的未处理异常有关。例如,当我想要访问测试块之外不存在的成员的模拟时,就会发生这种情况:

logger.info1111.mockImplementation((m, d) => console.info(m, d));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接