создайте/добавьте узел по сравнению с innerHTML

Поблочное тестирование является тестированием единицы кода (например, единственная функция) без потребности в инфраструктуре, на которую полагается та единица кода. т.е. протестируйте его в изоляции.

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

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

Говорят, что Ваша функция получила некоторые числа от базы данных и затем выполнила вычисление стандартного отклонения. Что Вы пытаетесь протестировать здесь? То, что стандартное отклонение вычисляется правильно или что данные возвращаются из базы данных?

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

5
задан Ben 26 October 2010 в 05:54
поделиться

6 ответов

Это всегда спорный аргумент, отчасти из-за того, что происхождение innerHTML несколько сомнительно с точки зрения стандартов. Я думаю, что статья QuirksMode по-прежнему актуальна, но я бы хотел, чтобы она обновилась. Возможно, свяжитесь с ppk по поводу их обновления, хотя я уверен, что он занят. Мы все могли бы извлечь выгоду из тестирования производительности предположений, которые мы делаем в веб-разработке. В конце концов, утверждения требуют точных данных для подтверждения, иначе это просто разговоры.

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

8
ответ дан 18 December 2019 в 10:46
поделиться

Если производительность имеет значение, хорошо знать, что innerHTML относительно быстр, особенно в MSIE: http://www.quirksmode.org/dom/ innerhtml.html

Тем не менее, он имеет плохую репутацию, поскольку изначально был "проприетарным" свойством Microsoft и / или на самом деле не был "ОО".

1
ответ дан 18 December 2019 в 10:46
поделиться

Учитывая, что мне нужно вставить несколько тегов, кажется, имеет смысл использовать innerHTML.

Только «несколько»? Тогда скорость не проблема. Когда вы создаете сотню, вы должны думать о том, что делаете. Проблема не в создании, а в манипуляции со списком дочерних узлов, которая становится все медленнее и медленнее по мере добавления каждого дополнительного элемента.

Что касается добавления, у вас действительно нет выбора. Вы не можете установить innerHTML без потери существующего контента, поэтому, если вас не устраивает сериализация и повторный анализ (который стирает все несериализуемые данные, такие как содержимое формы, свойства / ссылки JavaScript и обработчики событий), вы в конечном итоге установка innerHTML другого элемента и перемещение каждого дочернего элемента по одному. Это то, что делают многие фреймворки, и обычно это заканчивается даже медленнее, чем вручную create-and-appendChild.

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

Также могут быть более быстрые взломы с использованием объектов Range для одновременного перемещения загрузки HTML, но, к сожалению, диапазоны являются очень кроссбраузерными переменными. Мне кажется, однако, что кто-то должен иметь возможность быстро построить append-html из диапазона IE range.pasteHTML и диапазона W3 . extractContents . Кто-нибудь готов для этого?

Насколько я могу судить, узел create / append просто предотвращает создание недопустимого кода

Потенциально недопустимая разметка не означает, что ваше приложение ломается в некоторых браузерах. Когда вы слепо объединяете HTML, не убегая, как идиот:

element.innerHTML= '<a href="'+url+'">'+title+'</a>';

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

Вы можете, из Конечно, компромисс, создавая элементы и устанавливая их содержимое отдельными шагами. Например:

element.innerHTML= '<table>'+'<tr><td>X</td><td><a href="#">go</a></td></tr>'.repeated(urls.length)+'</table>';
for (var i= 0; i<urls.length; i++) {
    var row= element.firstChild.rows[i];
    row.cells[0].firstChild.data= urls[i];
    row.cells[1].firstChild.href= urls[i];
}

(string.repeated не является стандартным JavaScript, но его использование здесь очевидно.)

Это просто означает, что ваше приложение не работает в некоторых браузерах. Когда вы слепо объединяете HTML, не убегая, как идиот:

element.innerHTML= '<a href="'+url+'">'+title+'</a>';

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

Вы можете, из Конечно, компромисс, создавая элементы и настраивая их содержимое отдельными шагами. Например:

element.innerHTML= '<table>'+'<tr><td>X</td><td><a href="#">go</a></td></tr>'.repeated(urls.length)+'</table>';
for (var i= 0; i<urls.length; i++) {
    var row= element.firstChild.rows[i];
    row.cells[0].firstChild.data= urls[i];
    row.cells[1].firstChild.href= urls[i];
}

(string.repeated не является стандартным JavaScript, но его использование здесь очевидно.)

Это просто означает, что ваше приложение не работает в некоторых браузерах. Когда вы слепо объединяете HTML, не убегая, как идиот:

element.innerHTML= '<a href="'+url+'">'+title+'</a>';

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

Вы можете, из Конечно, компромисс, создавая элементы и устанавливая их содержимое отдельными шагами. Например:

element.innerHTML= '<table>'+'<tr><td>X</td><td><a href="#">go</a></td></tr>'.repeated(urls.length)+'</table>';
for (var i= 0; i<urls.length; i++) {
    var row= element.firstChild.rows[i];
    row.cells[0].firstChild.data= urls[i];
    row.cells[1].firstChild.href= urls[i];
}

(string.repeated не является стандартным JavaScript, но его использование здесь очевидно.)

4
ответ дан 18 December 2019 в 10:46
поделиться

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

0
ответ дан 18 December 2019 в 10:46
поделиться

Это зависит от вашей цели.

Использование методов DOM для вставки html в документ позволит вам дополнительно манипулировать этими элементами до и после их вставки.

0
ответ дан 18 December 2019 в 10:46
поделиться

Разница в том, что создание узлов через DOM стандартизировано, но innerHTML является просто стандартом де-факто. Я читал, что innerHTML может быть быстрее.

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

0
ответ дан 18 December 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: