该博客文章显示了一种方法来实现与温莎城堡和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);
}
使用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());