Версия Jeff Prosise от MSDN Magazine работает вполне прилично, но это имеет несколько дефектов:
AddNode
волнуется со ссылками на внешние сайты в Вашем меню (www.google.com, и т.д.)
Вот моя фиксация в BuildSiteMap()
:
SiteMapNode node = GetSiteMapNodeFromReader(reader);
string url = node.Url;
if (url.Contains(":"))
{
string garbage = Guid.NewGuid().ToString(); // SiteMapNode needs unique URLs
node.Url = "~/dummy_" + garbage + ".aspx";
AddNode(node, _root);
node.Url = url;
}
else
{
AddNode(node, _root);
}
SQLDependency
кэширование прохладно, но если Вы не хотите совершать поездку к DB каждый раз свои загрузки меню (для проверки, чтобы видеть, изменилась ли зависимость), и меню не изменяются очень часто, то почему бы не использовать HttpRuntime.Cache
вместо этого?
public override SiteMapNode RootNode
{
get
{
SiteMapNode temp = (SiteMapNode)HttpRuntime.Cache["SomeKeyName"];
if (temp == null)
{
temp = BuildSiteMap();
HttpRuntime.Cache.Insert("SomeKeyName", temp, null, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration);
}
return temp;
}
}
Указанный код неверен. Для начала, class myClass ():
должен быть class myClass:
. Также if name == "main":
должно быть:
if __name__ == "__main__":
unittest.main()
Помимо этих проблем, это не удается, потому что getName ()
вызывает исключение myExcOne
и ваш test ожидает исключения myExcTwo
.
Вот код, который работает. Измените код в вашем вопросе, чтобы нам было легко вырезать и вставить его в сеанс Python:
import unittest
class myExcOne(Exception): "exception one"
class myExcTwo(Exception): "exception two"
class myClass:
def getName(self):
raise myExcTwo
class test_myClass(unittest.TestCase):
def setUp(self):
self.myClass = myClass()
def testgetNameEmpty(self):
#self.assertRaises(myExcOne,self.myClass.getName)
self.assertRaises(myExcTwo,self.myClass.getName)
if __name__ == "__main__":
unittest.main()
Начиная со стороны, ()
после имени класса в оператор class
совершенно верен в современном Python - это вообще не ошибка.
По сути проблемы, assertRaises (MyException, foo)
задокументирован для распространения исключения, возникающие при вызове foo ()
, тип которого НЕ является подклассом MyException
- он перехватывает только MyException
и его подклассы. Поскольку ваш код вызывает исключение одного типа, а ваш тест ожидает исключение другого несвязанного типа, затем возникшее исключение будет распространяться согласно документации модуля unittest
, здесь , и я цитирую:
Тест проходит, если возникает исключение , является ошибкой, если возникает другое исключение, или терпит неудачу, если исключение не возникает.
А «является ошибкой» означает «распространяет другое исключение».
Когда вы перехватываете распространение исключения в вашем блоке try / except , вы аннулируете ошибку, и unittest
нечего диагностировать. Если ваша цель - превратить эту ошибку в ошибку (спорная стратегия ...), ваш блок except
должен вызвать self.fail
.
Тест проходит, если возникает исключение , является ошибкой, если возникает другое исключение, или терпит неудачу, если исключение не возникает.
А «является ошибкой» означает «распространяет другое исключение» .
Поймав исключение, распространяющееся в блоке try / except, вы аннулируете ошибку, и unittest
нечего диагностировать. Если ваша цель - превратить эту ошибку в отказ (спорная стратегия ...), ваш блок except
должен вызвать self.fail
.
Тест проходит, если возникает исключение , является ошибкой, если возникает другое исключение, или терпит неудачу, если исключение не возникает.
А «является ошибкой» означает «распространяет другое исключение» .
Поймав исключение, распространяющееся в блоке try / except, вы аннулируете ошибку, и unittest
нечего диагностировать. Если ваша цель - превратить эту ошибку в отказ (спорная стратегия ...), ваш блок except
должен вызвать self.fail
.
unittest
. Если ваша цель - превратить эту ошибку в ошибку (спорная стратегия ...), ваш блок except
должен вызвать self.fail
. s ничего не осталось для диагностики unittest
. Если ваша цель - превратить эту ошибку в отказ (спорная стратегия ...), ваш блок except
должен вызвать self.fail
.