2011-11-22 9 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コンテナを使用していた場合、彼らは多くを行う前にいることがわかりますをゲットオブジェクトグラフをトラバースしたり、慣習に基づいてオブジェクトを自動的に登録したり、オブジェクトライフを管理したりするなど、多くの付加的な細かい点があります電子レンジ、コンテナのスコーピングなど...あなた自身も実装できるこのようなものはたくさんありますが、構造マップなどの実用的なソリューションを実際に使用する必要があります

関連する問題