Мое решение для этого всегда просто использует следующее:
MoqProvider
public class MoqProvider<T> : Provider<T> // T is the desired service
{
protected override T CreateInstance(IContext context)
{
return new Mock<T>().Object;
}
}
Затем я также регистрирую IMissingBindingResolver
в моем ядре.MoqMissingBindingResolver
просто создает новую привязку к MoqProvider
для любой службы, для которой привязка еще не существует.
MoqMissingBindingResolver
public class MoqMissingBindingResolver : NinjectComponent, IMissingBindingResolver
{
public IEnumerable<IBinding> Resolve(Multimap<Type, IBinding> bindings, IRequest request)
{
if (request.Service.IsAbstract || request.Service.IsInterface)
{
var moqProvider = (IProvider)Activator.CreateInstance(typeof(MoqProvider<>).MakeGenericType(request.Service));
return new IBinding[]
{
new Binding(request.Service, new BindingConfiguration
{
ProviderCallback = ctx => moqProvider,
ScopeCallback = Settings.DefaultScopeCallback
})
};
}
else
{
return Enumerable.Empty<IBinding>();
}
}
}
I Обычнотакже установите Settings.DefaultScopeCallback
на одноэлементное значение, чтобы позднее я мог запрашивать свои макетированные объекты в своих тестах, когда мне нужно будет проверить, были ли определенные вызовы или не произошли, или настроить поведение на макетах до выполнения теста.Поэтому настройка моего ядра будет выглядеть следующим образом:
INinjectSettings Settings = new NinjectSettings
{
DefaultScopeCallback = StandardScopeCallbacks.Singleton
};
var k = new StandardKernel(Settings);
k.Components.Add<IMissingBindingResolver, MoqMissingBindingResolver>();
Надеюсь, это полезно.