使用MSTest在测试方法中引发异常

时间:2018-07-02 06:12:30

标签: c# unit-testing exception-handling code-coverage mstest

我正在使用MSTest为我的应用程序编写测试用例。
我有一种将文件从一个目录移动到另一个目录的方法。现在,当我运行代码覆盖率时,它表明catch块未包含在代码覆盖率中。
这是我的代码,如下所示。

class Class1
    {
        public virtual bool MoveFiles( string fileName)
        {
            bool retVal = false;
            try
            {
                string sourcePath = "PathSource";
                string destinationPath = "DestPath";
                if (Directory.Exists(sourcePath) && Directory.Exists(destinationPath))
                {
                    string finalPath = sourcePath + "\\" + fileName ;
                    if (Directory.Exists(finalPath))
                    {
                        File.Move(finalPath, destinationPath);
                        retVal = true;
                    }
                }
            }
            catch (Exception ex)
            {
                LogMessage("Exception Details: " + ex.Message);
                retVal = false;
            }
            return retVal;
        }
    }

上面代码的测试方法是这样。

[TestMethod()]
    public void MoveFilesTest()
    {
        string filename = "test";
        Class1 serviceObj = new Class1();
        var result = serviceObj.MoveFiles(filename);
        Assert.IsTrue(result);
    }

运行代码覆盖率时,它仅显示try块被覆盖,而catch块不被覆盖。因此,为了做到这一点,我需要编写另一个测试方法并生成一个异常,测试方法将类似于以下内容。

[TestMethod()]
    public void MoveFilesTest_Exception()
    {
        string filename = "test";
        Class1 serviceObj = new Class1();
        ExceptionAssert.Throws<Exception>(() => serviceObj.MoveFiles(filename));
    }

有人无法帮助我为此代码创建异常,或者至少指导我如何执行该代码?
非常感谢!

1 个答案:

答案 0 :(得分:1)

您可以在测试中使用Expected Exception Attribute来指示在执行过程中会出现异常。

以下代码将测试文件名中的无效字符,并应引发ArgumentException,因为>是文件名中的无效字符:

[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void InvalidCharacterInFileNameTest()
{
    string filename = "test>";
    Class1 serviceObj = new Class1();
    serviceObj.MoveFiles(filename);
}

更新

由于Directory.Exists()“抑制”了可能发生的任何异常,因此,如果源文件不存在或无效,则还需要更改函数中的代码以引发异常。

这只是一个示例,展示了如何实现它,但是您的代码看起来类似于:

public virtual bool MoveFiles(string fileName)
{
    bool retVal = false;
    try
    {
        string sourcePath = "PathSource";
        string destinationPath = "DestPath";
        if (Directory.Exists(sourcePath) && Directory.Exists(destinationPath))
        {
            string finalPath = sourcePath + "\\" + fileName;
            if (Directory.Exists(finalPath))
            {
                File.Move(finalPath, destinationPath);
                retVal = true;
            }
            else
            {
                throw new ArgumentException("Source file does not exists");
            }
        }
    }
    catch (Exception ex)
    {
        LogMessage("Exception Details: " + ex.Message);
        retVal = false;
    }
    return retVal;
}