这可能与统一(而不是温莎城堡)?(Is this possible with Unity (Inst

2019-07-29 10:37发布

该博客文章显示了一种方法来实现与温莎城堡和NSubstitute汽车嘲讽。

我不知道或未使用温莎城堡,但我不使用统一和NSubstitute。

有没有办法做什么,他表示使用Unity?


下面是帖子的相关内容:

首先,注册一个ILazyComponentLoader到温莎:

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);
}

Answer 1:

使用Unity你可以写一个自定义的容器延长它执行automocking。

基于此上的文章 ,你需要的东西,如:

编辑: 有我的执行样本中的错误:看到这太问题 : NSubstitute和团结

因此, 固定的代码如下所示:

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;
        }
    }
}

你可以创建cotainer时注册它:

IUnityContainer container = new UnityContainer();
container.AddExtension(new AutoMockingContainerExtension());


文章来源: Is this possible with Unity (Instead of Castle Windsor)?