Как решить проблемы приведения в свойствах классов ValidationRule? - PullRequest
2 голосов
/ 28 сентября 2011

Мне нужно создать несколько тестов для пользовательских ролей в веб-приложении.Чтобы свести описание к минимуму, один из тестов включает проверку, отображается ли пункт меню для пользователя.

Для этого теста я использую таблицу с именем UserRoles, которая выглядит следующим образом:

sUserName    bDoesntHaveMenuX
User1        1
User2        0
User3        1

bDoesntHaveMenuX имеет тип bit.

У меня есть класс, производный от ValidationRule, который проверяет, присутствует ли определенный текст на странице, на основе выражения XPath, чтобы найти узел, где искать текст,Открытые свойства этого класса:

string XPathExpression
string Text
bool FailIfFound

Последнее диктует, должно ли правило не работать, если текст найден или не найден.

В тесте я добавил источник данных дляТаблица, упомянутая в начале, называется DS.Для интересующего меня запроса я добавил новый экземпляр класса правил проверки со следующими значениями:

Text=MenuX
XPathExpression=//div[@id='menu']//td
FailIfFound={{DS.UserRoles.bDoesntHaveMenuX}}

К сожалению, это не работает.Кажется, причина в том, что процесс связывания данных создает переменную контекста DS.UserRoles.bDoesntHaveMenuX со значением «False» или «True».Значением является строка, поэтому привязка приводит к ошибке приведения.

Насколько я могу судить, у меня есть следующие варианты:

  1. Изменить правило проверки, чтобы принимать строкидля FailIfFound.Недопустимый параметр по двум причинам: это хак, и то же правило используется в других местах.
  2. Создайте новое правило проверки, которое будет использовать вышеупомянутое, и реализуйте FailIfFound в качестве строки.Мне тоже это не нравится по той же причине, что и выше.Это хак.
  3. Создайте тестовый код и выполните правильное приведение перед передачей данных в правило проверки.Мне это не нравится, потому что я предпочитаю, чтобы тест был закодирован только в том случае, если другого пути нет.

Что подводит меня к вопросу.Есть ли другой способ?

Спасибо.

1 Ответ

1 голос
/ 07 октября 2011

Итак, фундаментальная проблема заключается в том, что вы не контролируете, как привязка данных обрабатывает «битовый» тип данных, и он преобразуется в строку вместо bool.

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

Затем, когда будет создано правило проверки, оно должно выбрать новое значение bool и работать правильно.

, например

  string val = e.WebTest.Context["DS.UserRoles.bDoesntHaveMenuX"].ToString();
  e.WebTest.Context["DS.UserRoles.bDoesntHaveMenuX"] = (val == "True");

Я на самом деле не пробовал это ... надеюсь, что это работает.


РЕДАКТИРОВАТЬ: раунд два ... лучшее решение

  1. Измените свойство FailIfFound на string (в подклассе, как вы упомянули), чтобы оно могло правильно работать с привязкой данных.
  2. Реализуйте TypeConverter, который предоставляет раскрывающийся список допустимых значений для свойства в PropertyGrid правила (True, False), поэтому в GUI оно выглядит идентично правилу, в котором FailIfFound является логическим значением. При необходимости вы все равно можете ввести свое собственное значение в поле (например, для привязки данных).
  3. Добавьте путь к .dll, содержащей код TypeConverter, в раздел «Ссылки» вашего тестового проекта.

Это то, что я начал делать, и это гораздо приятнее, чем вводить «True» или «False» в поле редактирования свойства.

...