Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class ToDoMvcTest {
- @Test
- public void taskWorkFlow() {
- open("https://todomvc4tasj.herokuapp.com/");
- add("a");
- cancelEdit("a", "a edited");
- counter("1");
- /*
- этой проверки недостаточно
- нужна проверка списка тасок
- еще по этой проверке - ниже напишу
- */
- completeAll();
- /*
- вот тут с неймингом проблемы... ниже напишу
- */
- assertTasksAre("a");
- filterActive();
- assertTasksVisibleEmpty();
- /*
- пока все ок по сценарию)
- и удачно фильтеринг проверили
- по названиям методов - будет ниже
- */
- add("b");
- edit("b", "b edited");
- complete("b edited");
- assertTasksVisibleEmpty();
- /*
- тут тоже хорошо - эффективно неявные проверки использованы
- */
- filterCompleted();
- assertTasksAre("a", "b edited");
- complete("a");
- /*
- мы тут делаем не complete, a reopen
- про это - ниже будет
- */
- assertTasksVisible("b edited");
- clearCompleted();
- assertTasksVisibleEmpty();
- filterAll();
- assertTasksAre("a");
- delete("a");
- assertTasksEmpty();
- }
- /*
- сценарий - оптимальный
- вопросов к нему - лишь один - одна не точная проверка
- остальные вопросы - к неймингу
- ниже разберем
- */
- **************************************
- ElementsCollection tasks = $$("#todo-list li");
- /*
- есть селектор поточнее "#todo-list>li"
- тут можно и твой вариант использовать
- но бывают случаи - когда это критичная разница)
- */
- **************************************
- private void complete(String taskText) {
- tasks.find(exactText(taskText)).$(".toggle").click();
- }
- /*
- как думаешь, а почему в прошлой работе - метод называли toggle ?
- ты и сам использовал complete - чтобы переоткрыть таску)
- это не правильно - когда имя не отражает того, что делает метод (или не всегда отражает)
- имя метода должно всегда отражать - что делает метод
- toggle = переключить
- да, именно это мы и делаем - и когда комплитим, и когда переоткрываем таску
- поэтому - разумно оставить методу (так реализованному) имя toggle
- а чтобы было понятно - что это
- будут уместны комментарии в коде
- //reopen
- toggle("a");
- см https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.tmkuktenqqdi
- */
- *********************************************************************
- private void edit(String taskText, String taskNew) {
- tasks.find(exactText(taskText)).doubleClick();
- tasks.findBy(cssClass("editing")).$(".edit").setValue(taskNew).pressEnter();
- }
- private void cancelEdit(String taskText, String taskNew) {
- tasks.find(exactText(taskText)).doubleClick();
- tasks.findBy(cssClass("editing")).$(".edit").setValue(taskNew).pressEscape();
- }
- /*
- по именам параметров
- taskText - мы уже применяем для обозначения текста таски
- и тут будем)
- а для обозначения было-стало - часто применяется old & new , from & to
- oldTaskText & newTaskText
- fromTaskText & ToTaskText
- по реализации методов
- обрати внимание - код методов повторяется
- отличия - только pressEnter() или pressEscape()
- разработай метод xxx, возвращающий SelenideElement = элемент, в котором вводили новый текст
- в котором реализуй весь повторяющийся код
- и потом сможешь вызывать этот метод xxx(.....).pressEnter()
- подумай над названием для него
- это начало, старт редактирования
- */
- ***************************
- private void completeAll() {
- $("#toggle-all").click();
- }
- /*
- ситуация, аналогичная с complete vs toggle
- примени completeAll() - к закомпличеным таскам
- они переоткроются
- поправь имя метода)
- */
- ****************************
- private void counter(String... tasksCount) {
- $$("#todo-count>strong").shouldHave(exactTexts(tasksCount));
- }
- /*
- это метод - проверка
- имена таких методов лучше начинать с assert
- https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.sswzyp7qkm9o
- теперь давай определимся - assert чего
- а мы уже определялись - на шаг раньше - когда формулировали main use cases list
- assertItemsLeft - будет в самый раз
- если у тебя есть на User Interface термин - бери его
- это самый наглядный и однозначный вариант
- теперь про параметры
- сигнатура метода позволяет сделать вызов assertItemsLeft("a", "b", "c")
- и вот такой вызов assertItemsLeft()
- даже вот такой вызов - выглядит странно - assertItemsLeft("0")
- т к мы проверяем количество = число
- будет ок - если вызов будет выглядеть так assertItemsLeft(0)
- а для этого - тебе нужно изменить тип параметра метода
- реализация
- мы работаем не с коллекцией элеметов $$("#todo-count>strong")
- а с одним элементом $("#todo-count>strong")
- верно - будем проверять его текст
- для элемента - есть кондишен exactText - который проверит текст элемента - на равенство
- тебе именно он и нужен
- */
- ****************************************
- private void assertTasksAre(String... taskTexts) {
- private void assertTasksVisible(String... taskTexts) {
- private void assertTasksEmpty() {
- private void assertTasksVisibleEmpty() {
- /*
- по реализации методов - вопросов нету)
- как Яков тебе в слеке говорил, так и на видео эта мысль звучала -
- возможно, что более KISS - реализовать 2 проверки (с фильтрацией по visible)
- а не 4 - т к возникнуть сложности в их применении
- но и такой вариант имеет право на жизнь)
- про сложности - думаю, потом будут моменты - когда ты их увидишь)
- пока давай с именами методов разберемся
- правильнее - чтобы в построении имен - мы отталкивались от одних и тех же логических рассуждений
- в одних методах мы проверяем - таски = Tasks
- в других - видимые таски = VisibleTasks (именно такой порядок слов - отталкиваемся правил английского)
- https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.ubyujhyxdfwd
- если assertTasksAre
- то assertVisibleTasksAre
- а мне кажется - что и пара assertTasks и assertVisibleTasks - ничем не хуже)
- если assertTasksEmpty()
- то assertVisibleTasksEmpty()
- а мне кажется - что assertNoTasks и assertNoVisibleTasks - однозначнее
- на своих вариантах не настаиваю
- но в любом случае - учти моменты про порядок слов и общую логику
- */
- *****************************************************
- private void filterAll() {
- $("#filters>li:nth-child(1)").click();
- }
- private void filterActive() {
- $("#filters>li:nth-child(2)").click();
- }
- private void filterCompleted() {
- $("#filters>li:nth-child(3)").click();
- }
- /*
- примени в этих 3-х методах $(By.linkText(...))
- получишь код понагляднее
- */
Advertisement
Add Comment
Please, Sign In to add comment