2016-04-27 3 views
4

Я хочу сделать обычное тестирование пользовательского интерфейса (т. Е. Не используя SWTBot или другие рамки пользовательского интерфейса) содержимого NatTable.JUnit-тестирование NatTable

Мой подход заключается в создании оболочки, добавьте мой обычай NatTable, а затем получить доступ к ячейке и проверить его содержимое (значение данных конфигурации этикетки и т.д.):

// Note: this is Xtend code 
@Before 
def void setup() 
{ 
    shell = new Shell(Display.getCurrent) 
    shell.layout = new FillLayout 
    parent = new Composite(shell, SWT.NONE) 
    parent.layout = new GridLayout 
    fixture = new MyNatTableViewer(parent) // this is my custom nattable impl under test 
    shell.pack 
    shell.visible = true 
} 

@Test 
def void testLabel() 
{ 
    assertCellLabel(2, 2, "test-label"); 
} 

def assertCellLabel(int row, int col, String expected) 
{ 
    val labels = parameterTable.getCellByPosition(col, row)?.configLabels 
    assertThat(labels).describedAs("Labels for row " + row + " col " + col).isNotNull 
    assertThat(labels.labels).describedAs("Labels for row " + row + " col " + col).contains(expected) 
} 

Чтобы проверить мои другие компоненты, это было достаточно просто создать оболочку и родительский состав; упаковка и установка видимых не требовались для моих тестов. Тем не менее, с NatTable, getCellByPosition() возвращает null, если ячейка не видна - поэтому я добавил код для упаковки и установил видимость оболочки. Это работает для небольших таблиц (с двумя строками и несколькими столбцами).

К сожалению, это не работает для больших столов. Я подозреваю, что это связано с тем, что слой видового экрана не создает ячейки, которые не находятся в видимой области (которая, я знаю, сила NatTable), что она создает только требуемые структуры по требованию). Это, конечно, желательно для нормального поведения во время работы.

Но есть ли (более) способ получить ячейку гарантированным способом (другими словами, могу ли я заставить NatTable/ViewportLayer считать, что ячейка видна, поэтому я не получаю null, пока ячейка существует контент?)

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

+0

У меня нет ответа на ваш вопрос, но обычный совет заключается в том, чтобы держать верхний слой View/UI как можно более тонким и глупым и проверять все остальное. В вашем случае это действительно означает протестировать ваши отдельные компоненты NatTable (Аккумуляторы, Провайдеры, Обработчики событий) и доверять NatTable, чтобы отображать его правильно. – jhyot

ответ

1

Этот вопрос противоречив сам по себе. Вы просите метод черного ящика для тестирования NatTable, но вы хотите изменить поведение NatTable при тестировании. Это не черный подход!

Если вы действительно хотите протестировать с использованием метода «черного ящика», вам необходимо убедиться, что ячейка визуализирована. Это можно сделать путем запуска прокрутки, например. путем выполнения ShowCellInViewportCommand. Это реальный подход к черным ящикам, потому что возврат нулевого значения для невидимой ячейки является правильным результатом.

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

  1. Действуйте на слое ниже ViewportLayer. Обычно может использоваться SelectionLayer. Но, конечно, это ничего не значит, потому что уровень стека может отличаться от настройки к настройке. ViewportLayer - это тот, который вводит виртуальную природу в NatTable и способность прокрутки. Это позволяет избежать доступа к нижележащим слоям. Поэтому запрос одного из них вернет ожидаемое значение.

  2. Отключить ViewportLayer, выполнив команду TurnViewportOffCommand. Это в основном хак и может вызвать дополнительные вещи в спине, которые вам не нужны. Но я видел это предложение в других контекстах и ​​поэтому хочу назвать его здесь. Я не предлагаю использовать его в любом случае!

Обратите внимание, что оба подхода скорее похожи на хаки, когда мы говорим о тестировании черного ящика, потому что вы делаете предположения относительно композиции. Они не могут применяться вообще из-за различных способностей конфигурации.

Что касается скрытого вопроса о том, почему вам нужно установить видимость оболочки.Ну в основном потому, что SWT-события для рисования и изменения размеров необходимо запускать, чтобы правильно запускать вычисления размера и печатать NatTable в соответствии с состоянием оболочки. В наших примерах (которые также являются обычным SWT) мы называем Shell#open().

И как последний комментарий к вашей реализации, я не понимаю, почему вы являетесь подразделением NatTable. Наш API никогда не собирался это делать. Я полагаю, вы сделаете это, чтобы выполнить статическую предварительную настройку, например. стек слоя. Но лично мне это не нравится. Каждый раз, когда кто-то расширяет наши классы, чтобы переопределить некоторые внутренние методы, он попадает в вопросы или отчеты об ошибках, потому что поведение меняется. Но я думаю, что это, как правило, проблема открытого API, чтобы дать разработчикам максимально возможную гибкость при настройке.

+0

Спасибо, Дирк, за подробный ответ. Вы правы, мой подход на самом деле не черный, я просто хотел получить доступ к модели сверху, более или менее ... Что касается вашего последнего замечания: я не подклассифицирую 'NatTable'; эта деталь только что была размыта при сжатии моего кода для публикации. Я использую класс, который я называю «AbstractNatTableViewer», который обертывает «NatTable», и предоставляет настройку уровня и конфигурации, которая является общей для нескольких «NatTables» в наших приложениях, поэтому мы используем повторную базовую реализацию для 'NatTable' и их общих code ... –

0

Я также пытаюсь прочитать данные из невидимых ячеек nattable. Я пытаюсь использовать ShowCellInViewportCommand следующим образом:

widget.doCommand(new ShowCellInViewportCommand(gridlayer.getBodyLayer(), column, row)); 
//where row is say 50 and column is 20 and the cell is invisible. 

Я также попытался,

widget.doCommand(new ShowRowInViewportCommand(widget.getLayer(), row)); 
//here the default value given by nattable.getLayer is passed 

виджет corrosponds в nattable инстанции.

После вызова в пользовательском интерфейсе ничего не происходит. Ячейка не отображается. Нужно ли мне что-нибудь делать?

Как я могу перейти к чтению невидимых ячеек.

+0

Я также хотел бы рассмотреть это как новый вопрос. Я также не могу ответить на вопрос с данной информацией. Как выглядит слой вашего слоя? Сколько строк у вас есть и какую строку вы пытаетесь сделать видимой? 'ShowCellInViewportCommand' обрабатывается' ShowCellInViewportCommandHandler', который зарегистрирован в 'ViewportLayer'. Если это все на месте, оно должно работать. Если вы попытаетесь сделать видимую строку, которая не существует (помните о преобразовании в индексную позицию), ничего не произойдет. –

 Смежные вопросы

  • Нет связанных вопросов^_^