0

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

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

例如,我有一个名为 -

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


        }

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

4

3 回答 3

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 useful
    }
}
于 2013-11-05T05:06:53.253 回答
0

As the other answers below split the logic to two methods.

  • Method1: To create the Gzip
  • Method2: TO mail the file.

The Method1 can either return the zipped file or write it to a folder. Then you could unit test it like this:

  • Test1 Check whether file exists
  • Test2 Check whether file is in the Correct Format (try to unzip with the same logic inside the unit test method)

The Method2 can also be unit tested:

The link says how to unit test a mail sending functionality. All we need to do is to configure the web.config inorder to unit test the mail functionality

于 2013-11-05T05:24:25.380 回答
0

我会考虑将电子邮件发送部分移出当前方法。相反,我会从方法中返回压缩文件,并在方法完成后处理电子邮件发送作为第二步。在单元测试中测试发送和接收电子邮件非常困难。

这种方法对文件系统有很大的依赖,所以你的测试很可能是集成测试而不是单元测试,但我认为在这种情况下没问题,因为你想测试各种文件操作。不过,一个建议是在测试本身中创建您的测试所依赖的任何文件。这比假设某个文件退出更可靠。

于 2013-11-05T04:53:42.303 回答