python unittest assertRaises выдает исключение, когда assertRaises перестал работать

Версия 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;
    }
}
6
задан pjama 10 October 2012 в 22:18
поделиться

2 ответа

Указанный код неверен. Для начала, 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()
6
ответ дан 9 December 2019 в 20:47
поделиться

Начиная со стороны, () после имени класса в оператор 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 .

s ничего не осталось для диагностики unittest . Если ваша цель - превратить эту ошибку в ошибку (спорная стратегия ...), ваш блок except должен вызвать self.fail .

s ничего не осталось для диагностики unittest . Если ваша цель - превратить эту ошибку в отказ (спорная стратегия ...), ваш блок except должен вызвать self.fail .

6
ответ дан 9 December 2019 в 20:47
поделиться
Другие вопросы по тегам:

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