2013-11-05 28 views
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()); 
      } 


     } 

如何去上面的方法创建测试?

+0

切线位,但我强烈推荐阅读本书:[Essential-Skills-Agile-Developer](http:// www.amazon.com/Essential-Skills-Agile-Developer-Programming/dp/0321543734)。然后,在TDD上寻找一本书,你就会走上正确的道路...... – Noctis

回答

7

你的类走的是太多的责任
对于如所有权:逻辑获取的文件列表
逻辑拉链文件
逻辑发送电子邮件
本质上,这形成了工作流程

我对您的第一个建议是将这些职责分配给不同的服务(类别)
将这些服务注入到您的工作流程
自己测试服务
测试使用所有这些服务来完成工作

EG的工作流程:给定一个文件中有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 
    } 
} 
0

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

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

0

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

  • 方法一:要创建Gzip已
  • 方法2:将邮件文件。

Method1可以返回压缩文件或将其写入文件夹。 然后,你可以单元这样的测试:

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

的方法2还可以进行单元测试:

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