代码之家  ›  专栏  ›  技术社区  ›  John Polling

使用所需的系统库对服务进行单元测试

  •  2
  • John Polling  · 技术社区  · 17 年前

    举个例子,当测试一个搜索文件夹中一些插件的方法时,我正在这样做

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

    我有两个问题:

    1. 是否有更好的方法处理TDD的系统库项?
    2 回复  |  直到 17 年前
        1
  •  1
  •   Michael Hedgpeth    17 年前

    我最近也做了同样的事情,并提出了一个我自己的设计 Directory 具有 DirectoryBoundary 目录边界 它本身并没有直接进行单元测试,但我使用了一些集成测试来涵盖它。

    如果你朝这个方向走,我想你会发现你的设计变得更流畅,你的集成点也更容易。面对现实吧,.NET文件IO类不是为可测试性而设计的。所以,拿出你自己的。你可以嘲笑新的 类,或者像我做的那样,只使用伪边界类和某种形式的创建者。

        2
  •  0
  •   pero    17 年前

    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