这篇中型文章向我展示了如何防止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上试试。