使用赛普拉斯断言在表中排序

时间:2019-06-27 05:41:06

标签: javascript jquery node.js cypress

好吧,我有一个包含许多行和列的表,我想检查该表是否针对特定列进行了排序。

我尝试使用不同的期望和断言,但是它总是返回true。我在这里做错什么了吗?

cy.get('table tbody tr').should(function($trs) {
  var arrayOftd = $trs.map(function (i, tr) {
    return Cypress.$(tr).find('td').eq(3).text() 
  })
  var test = arrayOftd.sort()          
  expect(arrayOftd).to.deep.equal.(test)
})

按升序排序必须返回true,而按降序或其他任何顺序返回false

这是assert语句的控制台日志

命令:断言 cypress_runner.js:172385实际值:(13)[“ 946”,“ 947”,“ 948”,“ 951”,“ 952”,“ 955”,“ 956”,“ 959”,“ 960”,“ 963” ,“ 964”,“ 967”,“ 968”] cypress_runner.js:172385预期值:(13)[“ 946”,“ 947”,“ 948”,“ 951”,“ 952”,“ 955”,“ 956”,“ 959”,“ 960”,“ 963” ,“ 964”,“ 967”,“ 968”] cypress_runner.js:172385消息:预期[Array(13)]等于[Array(13)] cypress_runner.js:172385错误:AssertionError:预期[Array(13)]等于[Array(13)]

2 个答案:

答案 0 :(得分:0)

tl; dr

您必须在sort之前copy the array,否则必须对它进行声明,因为排序会更改数组。

var test = arrayOftd.slice().sort()

说明

sort不会返回新副本,它会更改数组in-place,因此,当您将其返回值分配给test并将其与arrayOftd进行比较时,您会对其进行比较自己。

引用MDN docs

  

sort()方法对数组in place的元素进行排序并返回排序后的数组。

请记住,slice不会创建数组的深层副本,它只会复制其第一级,但是如果仅更改第一级的顺序,就可以了。

答案 1 :(得分:0)

这可能是个人喜好,但是如果确实不需要,我会尽量不使用jQuery语法,以提高可读性。我所做的是:

function getCellTextAsArray(){
            let cellContents = []
            return new Cypress.Promise(resolve => {
                cy.get('table tbody tr')
                    .children()
                    .each(($el, $index) => {
                        //some logic to select the elements you want
                        //like $index % 4 == 0
                        if(...) {
                            cellContents.push($el.text())
                        }
                    })
                    .then(() => resolve(cellContents))
            })
        }

然后您就可以进行声明,而不必担心传递回调:

getCellTextAsArray()
                .then(cellContents => {
                    let actual = cellContents.slice()
                    cy.wrap(actual)
                        .should('deep.eq', cellContents.sort())})

所以这里发生的是,我们试图使用更高级别的赛普拉斯命令来捕获所有tds,当我们完成这些操作后,我们便会使用tds文本内容来解决Promise,那么这样做很容易阅读最后的断言。