2011-11-22 67 views
2

我正在爲每個每晚構建的單元測試塊添加基本的自動UI測試。我們使用了MSTest編碼的UI並創建了一個腳本。用於自動UI測試的模擬實現

代碼隱藏取決於IClientManager,實際管理者和模擬實現。 我的問題是,我不知道如何在運行測試時在按鈕點擊處理程序內部的真實和模擬實現之間自動切換。

我的另外兩個約束是,我不能在代碼隱藏方面依賴於模擬程序集,並且我不能使用DI框架,因爲客戶端是「安全意識」並獲得框架批准可能需要幾個月。

有沒有辦法做到這一點手動,並希望,不是一個更大的問題,而不是我想要解決的問題?

謝謝!

回答

3

你可以建立自己的簡單對象容器,如果你不能使用第三方一個(這是愚蠢的,但我明白,我以前去過那裏)

這裏的東西,我掀起了可能讓你開始......沒有測試它,它真的是粗糙,但希望你的想法

public static class ObjectFactory 
{ 
    static IDictionary<Type, object> _factory = new Dictionary<Type, object>(); 

    public static void Register<T>(Func<T> builder) 
    { 
     if (_factory.ContainsKey(typeof(T))) 
      _factory[typeof(T)] = builder; 
     else 
      _factory.Add(typeof(T), builder); 
    } 

    public static T GetInstance<T>() 
    { 
     if (_factory.ContainsKey(typeof(T))) 
      throw new ArgumentException(string.Format("Type <{0}> not registered in ObjectFactory", typeof(T).Name)); 

     return ((Func<T>)_factory[typeof(T)])(); 
    } 
} 

public interface IClientManager { } 
public class RealClientManager : IClientManager { } 
public class MockClientManager : IClientManager { } 

public class MyView 
{ 
    public MyView() 
    { 
     // probably better to do this registry in some sort of application initialization 
     ObjectFactory.Register<IClientManager>(() => new RealClientManager()); 
    } 

    public void SomeMethodThatNeedsClientManager() 
    { 
     var clientManager = ObjectFactory.GetInstance<IClientManager>(); 
    } 
} 

public class MyTester 
{ 
    [TestMethod()] 
    public void SomeTest() 
    { 
     var view = new MyView(); 

     // swap the client manager in the test 
     ObjectFactory.Register<IClientManager>(() => new MockClientManager()); 

     // Asserts 
    } 
} 

你可以看到,如果你已經使用StructureMap或其他一些DI容器之前他們做了很多同樣的事情還有很多額外的細節,比如遍歷對象圖並根據約定自動註冊對象,管理對象lif ecycles,容器範圍等等......很多這些東西你也可以實現......但是你應該真的使用了一個經過驗證的真正解決方案,比如StructureMap