web-dev-qa-db-fra.com

Utilisation de l'attribut ExpectedException

J'essaie de travailler avec l'attribut ExpectedException dans un C# UnitTest, mais j'ai des problèmes pour le faire fonctionner avec mon Exception particulier. Voici ce que j'ai obtenu:

REMARQUE: J'ai enroulé des astérisques autour de la ligne qui me pose problème.

    [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);
        }
    }

J'ai le ExpectedException attraper le type de base Exception. Cela ne devrait-il pas s'en occuper? J'ai essayé d'utiliser AttributeUsage, mais cela n'a pas aidé non plus. Je sais que je peux l'envelopper dans un bloc try/catch, mais j'aimerais voir si je peux comprendre ce style.

Merci a tous!

24
Jonathan

Il échouera sauf si le type d'exception est exactement le type que vous avez spécifié dans l'attribut, par exemple

PASSER:-

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

ÉCHOUER:-

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

Mais cela passera ...

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