好吧,我有一个包含许多行和列的表,我想检查该表是否针对特定列进行了排序。
我尝试使用不同的期望和断言,但是它总是返回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)]
答案 0 :(得分:0)
您必须在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,那么这样做很容易阅读最后的断言。