防止屏幕.findByX没有等待与eslint无限制语法?



这篇中型文章向我展示了如何防止await位于属性之前:

"no-restricted-syntax": [
"error",
{
"message": "promise.then is unnecessary when using async/await",
"selector": "AwaitExpression[argument.callee.property.name=" then"]"
}
]

但是我想要的正好相反,我想要限制这些

expect(screen.findByRole(...))....;
screen.findByRole(...);

expect(await screen.findByRole(...))....;
await screen.findByRole(...);

我在测试文件的覆盖下尝试了这个:

"no-restricted-syntax": [
"error",
{
"message": "Find By queries must be followed by an await",
"selector": ":not(AwaitExpression[argument.callee.property.name=/findBy.*/])"
}
]

但是现在每一行都显示了这个错误。我也试着把*放在前面,希望它能允许任何东西(*),除非后面跟着我禁止的语法表达式,但没有骰子。

我怎样才能使它工作?

AST选择器似乎可以工作:

:not(AwaitExpression) > CallExpression[callee.property.name=/^findBy.*$/]

选择器查找调用以findBy...开头的方法的非await表达式的直接子表达式。

整个规则可能看起来像:

"no-restricted-syntax": [
"error",
{
"message": "findBy... queries must be preceded by an await",
"selector": ":not(AwaitExpression) > CallExpression[callee.property.name=/^findBy.*$/]"
}
]

独立的功能对于不被对象调用的函数调用(例如,只是findByRole而不是screen.findByRole),您可以在选择器中省略property嵌套属性,如下所示:

:not(AwaitExpression) > CallExpression[callee.name=/^findBy.*$/]

如果你想匹配独立函数和方法函数,你可以有两个单独的规则,或者用:matches(...)选择器组合它们。

试一试

你可以在ESLint Playground上试试。

最新更新