2012-11-01 80 views
-1

我正在尋找關於如何實現以下操作的模式。OO:保留另一個無狀態對象內的對象的狀態

我有一個名爲的TestRunner一個對象,這是外部調用程序將調用並負責實例不同測試類和將執行他們的主類。

測試實例是無狀態的,並應在每次運行後銷燬。

裏面的測試比如我想有,雖然實例化的數據訪問類,用於緩存信息讀取的的TestRunner實例的生命週期和應重新用於不同測試處決。

因此,這意味着我的數據訪問類應該有像的TestRunner相同的壽命,但他們沒有直接連接,通過臨時測試類只間接。

什麼是實現這一目標的好方法? 有人爲數據訪問類推薦了一個單例,但我不喜歡這樣,因爲它會保持比我需要的更長的狀態(長於TestRunner life)。

也請注意,數據訪問類是具體到每個測試類,所以它不是那麼簡單,只是把它的TestRunner

的成員變量,我要求嚴格OO這裏,不使用特定的語言或框架。

謝謝! Bruno

回答

0

首先,如果測試實例是無狀態的,那麼沒有必要重複使用它們。

它看起來像我應該將一些TestRunnerContext實例或TestRunner實例本身傳遞給每個Test實例。然後這些實例可以將他們的數據訪問類實例添加到這個上下文中,以備後用。 TestRunnerContext實例將由TestRunner創建,並具有相同的生命週期。

+0

感謝您的回答......也許我錯誤地說它是無狀態的。實際上它是有狀態的,但數據在再次運行時必須消失(因此無論是清除還是重新創建整個對象,這對我來說都更好)。 –

1

我想你可能正在尋找命令模式。

這是你的一個測試簽名:

public interface ITest 
{ 
    void Execute(); 
} 

然後你有你的TestRunner類,從另一個(測試)提供商,TestProvider得到它的測試:

public class TestRunner 
{ 
    private readonly TestProvider _testProvider; 

    public TestRunner(TestProvider testProvider) 
    { 
     _testProvider = testProvider; 
    } 

    public void RunAllTests() 
    { 
     foreach (ITest test in _testProvider.GetTests()) 
     { 
      test.Execute(); 
     } 
    } 
} 

一個簡單的實現對於測試提供者(使用反射)可以是:

public class TestProvider 
{ 
    public IEnumerable<ITest> GetTests() 
    { 
     IEnumerable<Type> AllTypes = 
      AppDomain.CurrentDomain.GetAssemblies().ToList() 
       .SelectMany(s => s.GetTypes()) 
       .Where(p => typeof (ITest).IsAssignableFrom(p)); 
     foreach (Type typeToLoad in AllTypes) 
     { 
      if (!typeToLoad.IsInterface) 
       yield return (ITest) Activator.CreateInstance(typeToLoad); 
     } 
    } 
} 

...但既然你想在你的測試(如數據訪問)的依賴關係,我會考慮改進這個以允許依賴注入......但現在這將做(如果沒有測試提供程序的改進版本,Test2將無法正常工作 - 使用依賴注入)

所以,這裏是一個簡單的測試

public class Test1 : ITest 
{ 
    public void Execute() 
    { 
     Debug.WriteLine("I'm test 1"); 
    } 
} 

這裏是依賴於其他依賴(所以你需要實現依賴注入之前,這將工作)更復雜的測試:

public class Test2 : ITest 
{ 
    private IDataSource ds; 

    public void Execute() 
    { 
     ds.Store("I'm test 2"); 
    } 
} 

這遠不是p (我接受批評),但我希望這能給你一個好的起點。