1

このブログ投稿は、CastleWindsorとNSubstituteを使用して自動モックを実装する方法を示しています。

Castle Windsorを知らないか使用していませんが、UnityとNSubstituteを使用しています。

Unityを使用して彼が示していることを行う方法はありますか?


投稿の関連コンテンツは次のとおりです。

まず、ILazyComponentLoaderをWindsorに登録します。

var c = new WindsorContainer();    
c.Register(Component.For<LazyComponentAutoMocker>());

次に、LazyComponentAutoMockerの実装は次のようになります。

public class LazyComponentAutoMocker : ILazyComponentLoader
{    
  public IRegistration Load(string key, Type service, IDictionary arguments)    
  {    
    return Component.For(service).Instance(Substitute.For(new[] { service }, null));    
  }    
}

そして、あなたは完了です!上記のコードのみを使用した簡単な単体テストの例を次に示します。

[Test]
public void IDictionary_Add_Invoked()
{
  var dict = c.Resolve<IDictionary>();
  dict.Add(1, 1);
  dict.Received().Add(1, 1);
}
4

1 に答える 1

3

Unityを使用すると、自動モックを実行するカスタムコンテナー拡張機能を作成できます。

この記事に基づいて、次のようなものが必要です。

編集:私の実装サンプルにバグがありました:このSOの質問を参照してくださいNSubstituteとUnity

したがって、修正されたコードは次のようになります。

public class AutoMockingContainerExtension : UnityContainerExtension
{
    protected override void Initialize()
    {
        var strategy = new AutoMockingBuilderStrategy(Container);

        Context.Strategies.Add(strategy, UnityBuildStage.PreCreation);
    }

    class AutoMockingBuilderStrategy : BuilderStrategy
    {
        private readonly IUnityContainer container;
        private readonly Dictionary<Type, object> substitutes 
           = new Dictionary<Type, object>();

        public AutoMockingBuilderStrategy(IUnityContainer container)
        {
            this.container = container;
        }

        public override void PreBuildUp(IBuilderContext context)
        {
            var key = context.OriginalBuildKey;

            if (key.Type.IsInterface && !container.IsRegistered(key.Type))
            {
                context.Existing = GetOrCreateSubstitute(key.Type);
                context.BuildComplete = true;
            }
        }

        private object GetOrCreateSubstitute(Type type)
        {
            if (substitutes.ContainsKey(type))
                return substitutes[type];

            var substitute = Substitute.For(new[] {type}, null);

            substitutes.Add(type, substitute);

            return substitute;
        }
    }
}

また、コンテナを作成するときに登録できます。

IUnityContainer container = new UnityContainer();
container.AddExtension(new AutoMockingContainerExtension());
于 2012-05-16T22:23:20.997 に答える