Cypress test: .contains () эквивалентно must («содержать»)? - PullRequest
0 голосов
/ 26 апреля 2018

Это: cy.get('[name=planSelect]').contains(dummyPlan)

эквивалентно этому: cy.get('[name=planSelect]').should('contain', dummyPlan)

И если да, то что предпочтительнее? Первый - это скорее неявное утверждение, но, на мой взгляд, он короче и чище.

Следующий вопрос: Осмотревшись вокруг, чтобы увидеть, как лучше выбрать элементы для тестирования e2e, я обнаружил, что Cypress docs рекомендует использовать атрибуты data-cy. Есть ли причина, по которой это будет лучше, чем просто добавление атрибутов name в разметку? name должен использоваться только для полей форм?

Ответы [ 2 ]

0 голосов
/ 25 мая 2019

TLDR содержит лучший селектор. Он будет повторяться и соответствовать внутреннему тексту.


  • .should() требует, чтобы элемент, который вы хотите вернуть, уже был выбран
  • .contains(selector, content) ожидает пользовательского интерфейса и выбирает определенный элемент

Это не просто совпадает < tag > .class #id [attributes]

.contains(selector, content) - это селектор, который утверждает 'child content text'

0 голосов
/ 26 апреля 2018

Результат вашего теста на кипарис будет таким же, если элемент с name=planSelect не содержит dummyPlan, то есть в этот момент тест не пройден.

Разница между ними заключается в том, что в первой форме, используя contains () , вы фактически пытаетесь выбрать элемент, а результат cy.get (...). Содержит ( ) выдаст этот ожидаемый элемент DOM, допуская дальнейшее сцепление методов, таких как:

cy.get('[name=planSelect]').contains(dummyPlan).click();

Во второй форме вы делаете явное утверждение, чтобы убедиться, что dummyPlan существует в другом элементе, используя Chai chainer contain.

Это небольшая разница, и результат тот же, но я бы порекомендовал вам использовать cy.get('[name=planSelect]').contains(dummyPlan) только в том случае, если вы хотите связать какой-то другой метод после содержимого, и использовать вторую форму, если вы хотите явно утвердить что этот элемент существует. Логически говоря, первый будет представлять общий сбой теста (Cypress пытался найти элемент, которого там не было), а второй представляет явный сбой утверждения (элемент должен содержать dummyPlan, но это не так).

Что касается вашего второго вопроса, name является допустимым атрибутом HTML, и использование его для ваших тестов может привести к путанице, если атрибут используется в его исходной функции (для именования полей ввода) или если атрибут там просто в целях тестирования. Я бы порекомендовал вам использовать cy-name, как следует из документации, потому что таким образом вы избежите этой двусмысленности и дадите понять, что этот атрибут cy-name присутствует только в целях тестирования.

Более того, в некоторых ситуациях вы можете решить удалить все cy-name из своего кода перед отправкой в ​​производство (в процессе сборки, используя какой-нибудь плагин для веб-пакета, например string-replace-loader ). Вы не сможете сделать то же самое, если используете только name, потому что вы также удалили бы необходимый ввод name, если в вашем коде были какие-то входные данные.

...