Для тех из нас, кому нужно смоделировать исключение и не может сделать это простым исправлением head
, вот простое решение, которое заменяет целевое исключение пустым:
Скажем, у нас есть универсальный модуль для тестирования с исключением, который мы должны смоделировать:
# app/foo_file.py
def test_me():
try:
foo()
return "No foo error happened"
except CustomError: # <-- Mock me!
return "The foo error was caught"
Мы хотим смоделировать CustomError
, но поскольку это исключение, мы сталкиваемся с проблемами, если пытаемся исправить его, как и все остальное. Обычно вызов patch
заменяет цель на MagicMock
, но здесь это не сработает. Насмешки изящны, но они ведут себя не так, как исключения. Вместо того, чтобы патчить с макетом, давайте вместо этого сделаем исключение для заглушки. Мы сделаем это в нашем тестовом файле.
# app/test_foo_file.py
from mock import patch
# A do-nothing exception we are going to replace CustomError with
class StubException(Exception):
pass
# Now apply it to our test
@patch('app.foo_file.foo')
@patch('app.foo_file.CustomError', new_callable=lambda: StubException)
def test_foo(stub_exception, mock_foo):
mock_foo.side_effect = stub_exception("Stub") # Raise our stub to be caught by CustomError
assert test_me() == "The error was caught"
# Success!
Так что с lambda
? Параметр new_callable
вызывает все, что мы ему даем, и заменяет цель возвращением этого вызова. Если мы передадим наш класс StubException
прямо, он вызовет конструктор класса и исправит наш целевой объект с исключением instance , а не class , что не то, что мы хотим. Обернув его в lambda
, он возвращает наш класс, как мы и собирались.
Как только наше исправление выполнено, объект stub_exception
(который буквально является нашим классом StubException
) может быть поднят и пойман, как если бы это был CustomError
. Ухоженная!
Насколько мне известно, в jQuery нет поддержки "externalHTML", но вы можете написать функцию для его эмуляции (в браузерах, отличных от IE), или использовать this plugin :
// this will return the element and it's mark-up, of an element
// with the id myTag
var outer = $('#myTag').outerHTML();
Очевидно, реализация Брэндона - не единственная ... Я уверен, что вы могли бы придумать и другие умные реализации ..
EDIT
Если вы хотите избежать вызовов добавления , может быть, вы могли бы попробовать что-то вроде этого ...
function getOuterHTML(el)
{
var wrapper = '';
if(el)
{
var inner = el.innerHTML;
var wrapper = '<' + el.tagName;
for( var i = 0; i < el.attributes.length; i++ )
{
wrapper += ' ' + el.attributes[i].nodeName + '="';
wrapper += el.attributes[i].nodeValue + '"';
}
wrapper += '>' + inner + '</' + el.tagName + '>';
}
return wrapper;
}
// now, to replicate the sample above
var outer = getOuterHTML($('#myTag'));
Единственное, что я не уверен, все ли браузеры поддерживают массив атрибутов ... но я знаю, что есть у семейства Mozilla, а IE имеет встроенную поддержку externalHTML. . попробуйте (для тех, кто не поддерживает массив атрибутов, вы можете использовать предыдущий метод, который использует добавления)
Это будет хорошо работать:
jQuery.fn.outer = function() {
return $($('<div></div>').html(this.clone())).html();
}
Хм, вам не нужно использовать плагин, я уверен, что вы можете попробовать
// this uses the jquery selectors, then returns the DOM element,
// which then u can use the standard outterHTML...
$('#myelement').get(0).outerHTML;
Изменить: если ваши селекторы jquery соответствуют более чем одному элементу, вы можете пройти через них, обратитесь к документации jquery для примеры
Это сообщение в блоге может вам помочь.
Он описывает метод, который выглядит следующим образом:
var html = $('<div>').append($('#top').clone()).remove().html()
Это клонирует интересующий div, добавляет его к div-оболочке и затем получает html-код оболочки - который приравнивается к исходному html первого div.
Его предложение просто окружить его изначально объявленным div-оболочкой кажется лучшим вариантом. Тогда вам не придется заморачиваться со всем этим.
Без какого-либо кода выберите элемент, выберите первый внутренний элемент, получите его родительский элемент (тот, который вам нужен), а затем оберните его вокруг исходного выделения из youElement.html ().