如何为Ninject创建一个Moq提供程序
本文关键字:一个 Moq 程序 Ninject 创建 | 更新日期: 2023-09-27 18:03:52
我想创建一个简单的Ninject提供程序,它返回Moq实例而不是具体类型。到目前为止,我有这个:
public class NinjectMockProvider<T> : IProvider
{
public static Type Type { get { return typeof(T); } }
public object Create(IContext context)
{
Mock<T> newMock = new Mock<T>();
return newMock.Object;
}
}
但这都是错的,我肯定,因为我不知道我真的在做什么。任何帮助和代码样本将是伟大的。我只想有能力做到:
kernel.Bind<ISomeInterface>().ToProvider<NinjectMoqProvider<ISomeInterface>>();
之类的
更新我发现我可以通过使用Ninject的方法绑定来完成我想要的:
kernel.Bind<ISomeInterface>().ToMethod(x => new Mock<ISomeInterface>().Object);
我仍然想要一个更优雅的方式,我可能不得不检查Ninject。Moq是由Ian建议的,但如果有人有任何真实的代码示例,那将是很棒的。
MockingKernel扩展处理你需要什么?它有Moq、RhinoMocks和NSubstitute口味,也可以在NuGet上使用。
我的解决方案总是使用以下方法:
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>();
}
}
}
我通常还将Settings.DefaultScopeCallback
设置为单例,这样当我需要验证某些调用是否发生时,我可以在稍后的测试中请求我的模拟对象,或者在执行测试之前设置模拟行为。因此,设置我的内核将如下所示:
INinjectSettings Settings = new NinjectSettings
{
DefaultScopeCallback = StandardScopeCallbacks.Singleton
};
var k = new StandardKernel(Settings);
k.Components.Add<IMissingBindingResolver, MoqMissingBindingResolver>();
希望对大家有帮助