我正在使用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));
}
有人无法帮助我为此代码创建异常,或者至少指导我如何执行该代码?
非常感谢!
答案 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;
}