首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[ExpectedException(typeof(AnExceptionBaseException))]

[ExpectedException(typeof(AnExceptionBaseException))]
EN

Stack Overflow用户
提问于 2013-07-17 06:23:38
回答 1查看 1.3K关注 0票数 4

我编写了一个单元测试,它应该抛出AnExceptionAnotherException,两者都是从AnExceptionBaseException派生的。然后,我为基本异常添加了一个ExpectedExceptionAttribute,结果发现我的测试仍将被标记为失败。

测试名称: Call_Should_Throw_If_Device_Is_Not_Ready测试 ..。 结果消息:测试方法DiskManagementTests.DiskFreeSpaceTests.Call_Should_Throw_If_Device_Is_Not_Ready抛出异常System.IO.FileNotFoundException,但异常System.IO.IOException是预期的。异常消息: System.IO.FileNotFoundException:设备还没有准备好。(HRESULT例外: 0x80070015)

这似乎是一个合理的设计决策,因为在这种情况下,异常是从HRESULT返回代码生成的。这使得几乎不可能确定将抛出哪个异常。至少在不从我的测试应该是...test的单元复制代码逻辑的情况下是不会的。

我的代码(我相信这可以抛出FileNotFoundDirectoryNotFound):

代码语言:javascript
复制
[TestMethod]
[ExpectedException(typeof(IOException))]
public void Call_Should_Throw_If_Device_Is_Not_Ready()
{
    foreach (DriveInfo drive in DriveInfo.GetDrives().Where(drive => !drive.IsReady))
    {
        DiskFreeSpace diskFreeSpace = DiskManagement.GetDiskFreeSpace(drive.RootDirectory.FullName);
        Assert.Fail("API call did not fail even though the drive reports that it is not ready.");
    }
    Assert.Inconclusive("All drives were ready. Try testing with an empty disc drive.");
}

我是否需要重新考虑我编写单元测试的方式?

编辑

毕竟,这个场景是支持的。真正需要做的就是将AllowDerivedTypes设置为真。

代码语言:javascript
复制
[TestMethod]
[ExpectedException(typeof(IOException), AllowDerivedTypes = true)]
public void Call_Should_Throw_If_Device_Is_Not_Ready()
{
    // ...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-17 07:22:59

您可以创建自己的ExpectedException属性,以检查抛出的异常是否继承了属性中定义的异常。

代码语言:javascript
复制
public sealed class MyExpectedException : ExpectedExceptionBaseAttribute
{
    private Type _expectedExceptionBaseType;

    public MyExpectedException(Type expectedExceptionType)
    {
        _expectedExceptionBaseType = expectedExceptionType;
    }

    protected override void Verify(Exception exception)
    {
        Assert.IsNotNull(exception);
        Assert.IsTrue(exception.GetType().IsInstanceOfType(typeof(_expectedExceptionBaseType)) || 
                      exception.GetType().IsSubclassOf(typeof(_expectedExceptionBaseType)));
    }
}

并将属性更改为测试:

代码语言:javascript
复制
[MyExpectedException(typeof(IOException))]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17692570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档