Тестовый пример для провала этого кода? - PullRequest
2 голосов
/ 31 июля 2009

Я должен сохранить код от подрядчика. У этого есть "интересный" фрагмент:

String webServicesValue = 
  webResponse.substring(webResponse.indexOf("<" + fieldName + ">") + 
                        fieldName.length() + 2, 
                        webResponse.indexOf("</" + fieldName + ">"));

Мне потребовалось несколько минут, чтобы понять, что он пытается сделать.

Кажется, это код WTF, но мой коллега предложил: «Если он не сломан, не исправляйте его». Мне интересно, если этот код когда-нибудь не получится. Кажется, он работает до сих пор, и я, честно говоря, не могу придумать ни одного тестового случая, чтобы это провалить

Спасибо

Ответы [ 6 ]

8 голосов
/ 31 июля 2009

Да. Он выдаст исключение, если "" не присутствует в ответе. В частности, он попытается вызвать webResponse.substring (fieldName.length () + 1, -1);

"" вызовет аналогичные проблемы, как и любые атрибуты элемента.

И если вы получите " ... ... ... ", вы получите неправильный ответ.

РЕДАКТИРОВАТЬ: в свете последующих обсуждений я бы сказал, что этот код должен быть переписан для использования правильного анализатора XML ... если только вы / ваша команда не можете гарантировать, что код никогда не иметь дело с проблемным XML. XML просто допускает слишком много допустимых (и недействительных) вариантов, чтобы обрабатывать их произвольными строками.

6 голосов
/ 31 июля 2009

Что произойдет, если вы получите <fieldname/>?

2 голосов
/ 31 июля 2009

В дополнение к ответам Игоря Брейка и Стивена С. выше есть CDATA:

<fieldname><![CDATA[ I am not really </fieldname> ]]></fieldname>

или даже

<othertag>
  <![CDATA[ I am not really <fieldname> and there is no closing tag ]]>
</othertag>
2 голосов
/ 31 июля 2009

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

1 голос
/ 31 июля 2009
  • Вложенные теги. Вы начнете с первого открытого тега, пропустите все существующие и остановитесь на первом теге закрытия вместо соответствующего тега закрытия.
  • Где-то перед открытым тегом есть закрывающий тег (вы ищете закрывающий тег в начале строки, а не в конце открытого тега)
1 голос
/ 31 июля 2009

Я бы предложил переписать его в этом случае. Если это нелегко понять, то сложнее проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...