使代码可测试 - 单元测试

时间:2013-11-05 04:43:51

标签: c# unit-testing

我是新手,我以前从未做过单元测试。

我制作了一个控制台应用程序来压缩文件并发送电子邮件。现在我想进行单元测试。但我不确定我的代码是否可测试。

例如,我有一个名为 -

的方法
 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());
            }


        }

如何为上述方法创建测试?

3 个答案:

答案 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)

正如下面的其他答案将逻辑拆分为两种方法。

  • 方法1:创建Gzip
  • 方法2:邮寄文件。

Method1可以返回压缩文件或将其写入文件夹。 然后你可以像这样对它进行单元测试:

  • Test1检查文件是否存在
  • Test2检查文件是否在 正确的格式(尝试在单元测试中使用相同的逻辑解压缩 方法)

Method2也可以进行单元测试:

link说明了如何对邮件发送功能进行单元测试。我们需要做的就是配置web.config以便对邮件功能进行单元测试