Вопрос по – Возможно ли это с Unity (вместо Castle Windsor)?

1

этоСообщение блога показывает способ реализовать автоматическое моделирование с помощью Castle Windsor и NSubstitute.

Я не знаю и не использую Castle Windsor, но я использую Unity и NSubstitute.

Есть ли способ сделать то, что он показывает, используя Unity?

Here is relevant content of the post:

Прежде всего, зарегистрируйте 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);
}

Ваш Ответ

1   ответ
3

С Unity вы можете написать свое собственное расширение контейнера, которое выполняет автокинг.

Основываясь на этомстатьявам нужно что-то вроде:

РЕДАКТИРОВАТЬ:There was a bug in my implementation sample: see this SO question: NSubstitute и Unity

Итакfixed code looks как это:

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());
Error: User Rate Limit Exceeded Vaccano
Error: User Rate Limit ExceededsameError: User Rate Limit Exceeded

Похожие вопросы