为什么评估此正则表达式时,赛普拉斯会超时?

时间:2018-12-21 18:28:46

标签: javascript regex testing cypress

我是柏树的新手,对自己做错了事感到好奇。

我有一个测试,可以验证页面上表格的内容。其中一列包含格式化的日期-该日期可能会稍微偏离一点,所以我使用正则表达式来验证它,而不是严格的比较。

测试看起来像这样:

it.only('I can see the date',  ()=> {

    // Match dates like 'Dec. 21, 2018 at 1:12 pm'
    const approximateTime = new RegExp(Cypress.moment().format('MMM[\]. D, YYYY [at] h:[.. [a|p]m]'));

    cy.get('table.activity-log').within(() => {
        cy.get('tbody tr').eq(0).within(() => {
            cy.get('td').eq(0).invoke('text').should('match', approximateTime);
...

我正在针对HTML运行它,它与期望的元素匹配,看起来像:

<td>
    Dec. 21, 2018
    <span> at </span>
    1:12 pm
</td>

测试在重试时运行并超时:

AssertionError: expected 'Dec. 21, 2018 at 1:12 pm' to match /Dec. 21, 2018 at 1:.. {a|p}m/

我在.invoke('text')或测试中的其他地方做错了吗?

1 个答案:

答案 0 :(得分:0)

我知道了-样本中有两个问题。

@ug_发现了一个问题,moment.format()在渲染文字方括号时效果不佳。他们建议使用捕获小组来解决该问题:

之前:
moment().format('MMM[\]. D, YYYY [at] h:[.. [a|p]m]')

之后:
moment().format('MMM[\]. D, YYYY [at] h:[.. (a|p)m]')

此外,我意识到要匹配的字符串包含两个&nbsp;字符,而正则表达式中的空格则不匹配。使用\s解决了这个问题。

现在的最终模式是:
moment().format('MMM[\\.] D, YYYY[\\sat\\s]h:[\\d{2} (a|p)m]')

一旦我修复了模式,测试就会按预期通过。