No código abaixo, por que tenho que repetir cy.wrap(article)
em vez de encapsulá-lo uma vez e armazenar o resultado encapsulado em uma variável reutilizável, como mostrado na linha três?
verifyArticleContent(article: JQuery<HTMLElement>, expected_article: Topic) {
// Wrapping once does not work.
// const article2 = cy.wrap(article)
// Title
cy.wrap(article).find('h2 a')
.should('have.text', expected_article.title)
.and('have.attr', 'href', '/forum/discussion/' + expected_article.id)
// Description
cy.wrap(article).find('p.data-description').should('have.text',
expected_article.description.substring(0, 300) + ' ...')
// Details
cy.wrap(article).find('p.data-author-date').should('have.text',
expected_article.user?.username + ', ' + // username
Util.dateToString(expected_article.date, 'en')) // date
}
Mais esclarecimentos e um exemplo de como pensei que funcionaria:
verifyArticleContent(article: JQuery<HTMLElement>, expected_article: Topic) {
// Wrapping once does not work.
const article2 = cy.wrap(article)
// Title
article2.find('h2 a')
.should('have.text', expected_article.title)
.and('have.attr', 'href', '/forum/discussion/' + expected_article.id)
// STOPS WORKING HERE. If I comment out this description check, it fails on the details with the same (almost) error.
// Description
article2.find('p.data-description').should('have.text',
expected_article.description.substring(0, 300) + ' ...')
// Details
article2.find('p.data-author-date').should('have.text',
expected_article.user?.username + ', ' + // username
Util.dateToString(expected_article.date, 'en')) // date
}
O Cypress funciona com comandos encadeados, onde o "assunto" do teste é passado pela cadeia.
O forte conselho dado aqui em Conceitos básicos é não usar o valor atribuído da cadeia, pois esse assunto pode ser alterado durante a cadeia.
Para ilustrar, aqui está um exemplo mínimo que faz exatamente o que seu código está fazendo.
Estou criando seu
article: JQuery<HTMLElement>
parâmetrocy.get('body').then($body =>
e aplicandocy.wrap()
a ele o mesmo que você fez.Depois
.and('have.attr', 'href', ...
adicionei um log de console para inspecionar o assunto atual.A saída do console é
então o sujeito não é mais
body
, é o<a>
elemento.A mensagem de falha do Cypress informa exatamente o que está acontecendo: