2009-04-20 48 views
2

我正在编写一个我正在编写的“PluginsService”。我需要使用Assembly,AssemblyName,Directory和File的系统库。目前我正在为每一个创建包装接口,所以我可以在测试中嘲笑它们。然而,这意味着我不得不在服务中注入不少包装。单元测试需要系统库的服务

因此,例如测试,搜索一个文件夹一些插件我这样做

With.Mocks(mockery) 
    .Expecting(() => 
    { 
      Expect.Call(directory.GetFiles(PLUGINPATH, PLUGINSEARCHPATTERN)).IgnoreArguments().Return(pluginLibraries); 
      Expect.Call(file.ReadAllBytes(null)).IgnoreArguments().Return(bytes); 
       Expect.Call(assemblyName.GetAssemblyName("fileName")).IgnoreArguments().Return(name); 
      Expect.Call(assembly.GetExecutingAssembly()).Return(executingAssembly); 
    }) 
    .Verify(() => result = service.FindAvailablePlugins()); 

的方法时,我有2个问题:

  1. 是否有处理系统图书馆更好的办法TDD项目?
  2. 是否有4个项目需要注入一个课程?

回答

1

我最近做同样的事情,并用设计,其中我有我自己的Directory对象,它有一个DirectoryBoundary,这是链接到目录上来。 DirectoryBoundary本身没有直接进行单元测试,但我使用了一些集成测试来覆盖它。

如果你朝这个方向努力,我想你会发现你的设计变得更流畅,你的整合点更容易。让我们面对它,.NET文件IO类不是为了可测试性而设计的。所以拿出你自己的。你可以嘲笑新的Directory类,或者做我所做的,只是假的边界类和你注入的某种形式的创建者。

希望有所帮助。

0

奥伦使用像这样的测试,以应付日期时间:

public static class SystemTime 
{ 
    public static Func<DateTime> Now =() => DateTime.Now; 
} 

,然后在测试:

SystemTime.Now =() => new DateTime(2000,1,1); 
repository.ResetFailures(failedMsgs); 
SystemTime.Now =() => new DateTime(2000,1,2); 
var msgs = repository.GetAllReadyMessages(); 
Assert.AreEqual(2, msgs.Length); 

这是注射替代,但不是线程安全的。 Dealing with time in tests

+0

谢谢我会看看这个 – 2009-04-24 10:02:49