【问题标题】:Issue in catching the thrown exception in Unit Test Case在单元测试用例中捕获抛出的异常的问题
【发布时间】:2018-08-13 04:59:16
【问题描述】:

我有一个接受参数源文件夹/源文件的方法。我已经以这样的方式处理代码,如果源文件夹或源文件不存在,它应该相应地抛出 DirectoryNotFound 异常或 FileNotFound 异常。 以下是代码片段

          Boolean isSourceExist = Directory.Exists(sourceFileorFolder);
          Boolean isFileExist = File.Exists(sourceFileorFolder);
            if (!(
                ((isSourceExist == true) && (isFileExist == false)) ||
                ((isSourceExist == false) && (isFileExist == true))
               ))
            {
                if (isSourceExist == false)
                    throw new DirectoryNotFoundException();
                else if (isFileExist == false)
                    throw new FileNotFoundException();
            }

在尝试针对负面情况对此方法进行单元测试时,即提供一个不存在的文件夹,[ExpectedException(typeof(DirectoryNotFoundException))] 在单元测试用例中失败。 但实际代码会根据输入抛出适当的异常来正确响应。

提前致谢

【问题讨论】:

  • 为什么需要if (!(((isSourceExist == true) && (isFileExist == false)) || ((isSourceExist == false) && (isFileExist == true))))
  • 谢谢切坦。您要求的条件是确保源必须以文件或文件夹的形式存在。
  • 支线话题:UT不应该执行真正的IO。

标签: c# unit-testing


【解决方案1】:

通常,您可以编写两种不同的测试,一种用于文件情况,另一种用于目录情况。

无论如何,这段代码很可能不会像您预期的那样运行。如果sourceFileorFolder 路径中存在文件或目录,则您发布的代码 sn-p 将始终抛出。

如果路径作为文件存在,则抛出DirectoryNotFoundException,否则抛出FileNotFoundException。仅当文件不存在时,您才继续进行而不抛出。

编辑:我错过了 if 大声明中的 !。实际上这个方法永远不会抛出,因为只有当文件不存在时才输入第一个if 语句(not ((folder and not file) or (file and not a folder)) 是一样的不是(文件或文件夹))。较小的if 语句的行为与我在上面写的一样。

【讨论】:

  • 非常感谢洛蒂。我想在您之前的回复中添加一点。当我运行实际代码时,此方法会正确响应,即它会为无效的源文件夹抛出 Directory not found 异常,并为无效的源文件抛出 File Not Found 异常。但是如果我测试这个方法,下面的 [ExpectedException(typeof(DirectoryNotFoundException))] 不起作用
  • 那么您发布的 sn-p 可能不包含导致该行为的代码?或者它可能与您正在运行的代码略有不同?发布整个方法会有所帮助。 -- 此外,明确声明您正在使用 Visual Studio 单元测试框架可能会有所帮助。
【解决方案2】:

不用这么复杂,去掉上面的if条件

Boolean isSourceExist = Directory.Exists(sourceFileorFolder);
Boolean isFileExist = File.Exists(sourceFileorFolder);

if (isSourceExist == false)
     throw new DirectoryNotFoundException();
else if (isFileExist == false)
     throw new FileNotFoundException();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    相关资源
    最近更新 更多