2016-05-04 5 views
0

Фон: Я работаю над автоматизацией приложения календаря, которое содержит UICollectionView со многими ячейками, представляющими временные интервалы.
У меня есть класс CalendarView с классом Login в качестве его суперкласса. Этот класс CalendarView содержит все методы, которые я использую в календаре, так что мои тесты выглядеть примерно такКак я могу повторно использовать переменную, полученную из цикла for, в методе другого метода в том же классе?

func testMakeAppointment() { 
    CalendarView() 
     .moveToCorrectSchedule() 
     .findEmptyCalendarCell() 
     .tapNewAppointmentCell() 
     .enterRegAppointmentInfo() 
     .tapLatestAppointment() 

На моем findEmptyCalendarCell() я использую для цикла, чтобы найти первую доступную ячейку, на мячи по календарю. Метод выглядит следующим образом:

func findEmptyCalendarCell() ->CalendarView { 
    let partialCellPath = XCUIApplication().collectionViews.childrenMatchingType(.Other) 
    let start: UInt = 10 
    let totalAmountOfCells = partialCellPath.count 
    for i in start...totalAmountOfCells { 
     if partialCellPath.elementBoundByIndex(i).otherElements["CalendarCell"].exists == true { 
      if partialCellPath.elementBoundByIndex(i).otherElements["CalendarCell"].hittable == true { 
       partialCellPath.elementBoundByIndex(i).otherElements["CalendarCell"].tap() 
      xctc.pauseForSeconds(1) 
      } 
     } 
    } 

    return CalendarView() 
} 

На двух следующих методов, я нажимаю ячейку, я нашел и ввести информацию о назначении и создать назначение.

Задача: До этого момента все хорошо. Тем не менее, теперь мне нужно нажать назначение, которое я только что создал, чтобы утверждать, что объект назначения теперь существует в календаре. (Это будет сделано в рамках метода tapLatestAppointment().

Если бы я мог каким-то образом повторно использовать переменную i из за петли в findEmptyCalendarCell() нажать ту же ячейку я использовал для создания назначения, это было бы здорово. Но, к сожалению, я могу 't похоже, чтобы найти способ сохранить эту переменную для последующего использования.

Может ли кто-нибудь помочь мне найти возможное решение? Я пытался сделать переменной класса типа UInt ?, но так как я возвращаю новый экземпляр из CalendarView() после каждого метода это значение всегда nil :(

Заранее спасибо

ответ

1

Конечно, гораздо лучшей моделью было бы, если бы новый CalendarView не был возвращен после каждого вызова метода, но если вы хотите избежать перезаписи своей реализации, вы можете просто сделать i глобальной переменной, объявленной вне любого класса. В качестве альтернативы вы можете создать класс именно для этой цели, который будет иметь статическое свойство.

В цикле for значение будет доступно только внутри цикла. Если бы это было не так, мы бы имели тысячи переменных, плавающих вокруг в каждом пространстве имен для приложений, которые использовали много for, память забивалась бы, и было бы больно кодировать, совершенно откровенно.

Но на основе вашего кода то, что вы действительно хотите, - это не способ ссылаться на i, который меняется на каждую итерацию for, но способ идентифицировать последний отображаемый индекс.

Так как о чем-то вроде:

func findEmptyCalendarCell() ->CalendarView { 
    let partialCellPath = XCUIApplication().collectionViews.childrenMatchingType(.Other) 
    let start: UInt = 10 
    let totalAmountOfCells = partialCellPath.count 
    for i in start...totalAmountOfCells { 
     if partialCellPath.elementBoundByIndex(i).otherElements["CalendarCell"].exists == true { 
      if partialCellPath.elementBoundByIndex(i).otherElements["CalendarCell"].hittable == true { 
       partialCellPath.elementBoundByIndex(i).otherElements["CalendarCell"].tap() 
       selectedIndex = i // See below 
       xctc.pauseForSeconds(1) 
      } 
     } 
    } 

    return CalendarView() 
} 

Где selectedIndex будет определен в глобальном масштабе, в любой файл в пределах модуля и вне всяких скобок, например:

var selectedIndex: Int? = nil 

Тогда в любой ситуации, когда вы хотите, чтобы выбранный индекс вернулся к nil, просто установите его как таковой:

selectedIndex = nil 

В tapLatestAppointment, тогда вам нужно будет отступить, если selectedIndex is nil.

+0

Спасибо Мэтью, но только из любопытства, как я могу это сделать, поэтому я не создаю новые экземпляры CalendarView() и все же сохраняю тесты как чистые, как выше? – Citronex

+0

У меня нет решения для этого, так как я не знаю вашей полной реализации, но если вы просто делаете это для тестов (что-то, что не нажимало на меня в первый раз), то это, наверное, хорошо. –

+0

Как я и ожидал, с использованием глобальной переменной этот путь всегда возвращает nil. Я подозреваю, что это потому, что значение selectedIndex возвращается к нулю, когда я запускаю новый экземпляр CalendarView(). – Citronex