我是新手,我以前从未做过单元测试。
我制作了一个控制台应用程序来压缩文件并发送电子邮件。现在我想进行单元测试。但我不确定我的代码是否可测试。
例如,我有一个名为 -
的方法 public static void readAndEmailCsvFiles(string filePath)
{
DirectoryInfo directory = new DirectoryInfo(filePath);
var files = directory.GetFiles("*.csv", SearchOption.AllDirectories);
var dirDate = string.Format("{0:yyyy-MM-dd HH-mm}", DateTime.Now);
bool isExists = System.IO.Directory.Exists(filePath + "\\" + "PROCESSED" + "\\" + dirDate);
if (!isExists)
{
System.IO.Directory.CreateDirectory(filePath + "\\" + "PROCESSED" + "\\" + dirDate);
}
try
{
using (Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile())
{
foreach (var file in files)
{
Console.WriteLine("Processing File : " + file + "\n");
zip.AddFile(file.FullName, "");
zip.Save(Path.Combine(filePath, "PROCESSED", dirDate, file.Name) + ".zip");
sendEmail.SendMailMessage(Path.Combine(filePath, "PROCESSED", dirDate, file.Name) + ".zip");
}
}
foreach (var file in files)
{
File.Delete(file.FullName);
Console.WriteLine("");
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
如何为上述方法创建测试?
答案 0 :(得分:7)
你的班级承担了太多的责任
例如:获取文件列表的逻辑
拉链文件的逻辑
发送电子邮件的逻辑
从本质上讲,这构成了您的工作流程
我的第一个建议是将这些责任分配给不同的服务(类)
将这些服务注入您的工作流程
自己测试服务
测试使用所有这些服务的工作流程来完成工作
例如:给出文件的EmailService类发送电子邮件
例如:具有FileRepository类,用于获取给定路径的文件列表
等等
注入这些服务的一种可能方式如下
public class ClassName
{
public ClassName(IEmailService emailService, IFileRespository fileRepository)
{
// You might want store the reference to these injected services
// and later use them to perform useful work
}
public void DoSomething()
{
// Do Something usefull
}
}
答案 1 :(得分:0)
我会考虑将电子邮件发送部分移出当前方法。我会从方法返回压缩文件,并在方法完成后继续处理电子邮件发送的第二步。在单元测试中测试发送和接收电子邮件非常困难。
此方法对文件系统有很大的依赖性,因此您的测试可能是集成测试而不是单元测试,但我认为在这种情况下可以,因为您要测试各种文件操作。但有一条建议是在测试中创建测试所依赖的任何文件。这比假设退出某个文件更可靠。
答案 2 :(得分:0)
正如下面的其他答案将逻辑拆分为两种方法。
Method1可以返回压缩文件或将其写入文件夹。 然后你可以像这样对它进行单元测试:
Method2也可以进行单元测试:
link说明了如何对邮件发送功能进行单元测试。我们需要做的就是配置web.config以便对邮件功能进行单元测试