Использование атрибута ExpectedException

Я пытаюсь работать с атрибутом ExpectedException в C# UnitTest, но у меня возникают проблемы с его работой с моим конкретным Exception. Вот что я получил:

ПРИМЕЧАНИЕ. Я обвел звездочками строку, которая вызывает у меня затруднения.

    [ExpectedException(typeof(Exception))]
    public void TestSetCellContentsTwo()
    {
        // Create a new Spreadsheet instance for this test:
        SpreadSheet = new Spreadsheet();

        // If name is null then an InvalidNameException should be thrown. Assert that the correct 
        // exception was thrown.
        ReturnVal = SpreadSheet.SetCellContents(null, "String Text");
        **Assert.IsTrue(ReturnVal is InvalidNameException);**

        // If text is null then an ArgumentNullException should be thrown. Assert that the correct
        // exception was thrown.
        ReturnVal = SpreadSheet.SetCellContents("A1", (String) null);
        Assert.IsTrue(ReturnVal is ArgumentNullException);

        // If name is invalid then an InvalidNameException should be thrown. Assert that the correct 
        // exception was thrown.
        {
            ReturnVal = SpreadSheet.SetCellContents("25", "String Text");
            Assert.IsTrue(ReturnVal is InvalidNameException);

            ReturnVal = SpreadSheet.SetCellContents("2x", "String Text");
            Assert.IsTrue(ReturnVal is InvalidNameException);

            ReturnVal = SpreadSheet.SetCellContents("&", "String Text");
            Assert.IsTrue(ReturnVal is InvalidNameException);
        }
    }

У меня ExpectedException улавливает базовый тип Exception. Разве это не должно заботиться об этом? Я пробовал использовать AttributeUsage, но это тоже не помогло. Я знаю, что могу обернуть его в блок try/catch, но я хотел бы посмотреть, смогу ли я понять этот стиль.

Спасибо всем!


person Jonathan    schedule 01.10.2013    source источник


Ответы (1)


Это не удастся, если тип исключения не будет точно таким, как вы указали в атрибуте, например

ПРОХОДЯТ:-

    [TestMethod()]
    [ExpectedException(typeof(System.DivideByZeroException))]
    public void DivideTest()
    {
        int numerator = 4;
        int denominator = 0;
        int actual = numerator / denominator;
    }

ПОТЕРПЕТЬ ПОРАЖЕНИЕ:-

    [TestMethod()]
    [ExpectedException(typeof(System.Exception))]
    public void DivideTest()
    {
        int numerator = 4;
        int denominator = 0;
        int actual = numerator / denominator;
    }

Однако это пройдет...

    [TestMethod()]
    [ExpectedException(typeof(System.Exception), AllowDerivedTypes=true)]
    public void DivideTest()
    {
        int numerator = 4;
        int denominator = 0;
        int actual = numerator / denominator;
    }
person Mick    schedule 01.10.2013
comment
Работает как шарм, спасибо за объяснение. Вот немного легкой репутации, ура! - person Jonathan; 01.10.2013
comment
Я бы не рекомендовал [TestMethod()] [ExpectedException(typeof(System.Exception), AllowDerivedTypes=true)] По той же причине я бы не рекомендовал ... catch(Exception ex) {.... - person Mick; 01.10.2013
comment
Разве нам не нужна попытка/поймать ожидаемый оскорбительный код, чтобы поймать ожидаемое исключение? - person Su Llewellyn; 15.06.2017
comment
Перехват исключения @SuLlewellyn без повторного создания приведет к сбою теста при применении атрибута ExpectedExceptionAttribute. - person Mick; 20.06.2017