2009-04-20 46 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