【问题标题】:making code testable - unit testing使代码可测试 - 单元测试
【发布时间】:2013-11-05 04:43:50
【问题描述】:

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

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

例如,我有一个方法叫做 -

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


        }

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

【问题讨论】:

  • 有点切线,但我强烈推荐阅读这本书:Essential-Skills-Agile-Developer。然后,找一本关于 TDD 的书,你就会走上正确的道路……

标签: c# unit-testing


【解决方案1】:

你的班级承担了太多责任:

  • 获取文件列表的逻辑
  • 压缩文件的逻辑
  • 发送电子邮件的逻辑
  • 基本上这构成了您的工作流程

我给您的第一个建议是将这些职责分摊到不同的服务(类)中,将这些服务注入您的工作流程,单独测试每个服务,最后测试使用所有这些服务完成工作的工作流程

例子:

  • 让给定文件的 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
    }
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      Method2 也可以进行单元测试:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-19
        • 2019-11-03
        • 2015-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-23
        • 2013-04-16
        相关资源
        最近更新 更多