如何为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建议的,但如果有人有任何真实的代码示例,那将是很棒的。

如何为Ninject创建一个Moq提供程序

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

然后我还在内核中注册了一个IMissingBindingResolverMoqMissingBindingResolver简单地为任何没有绑定的服务创建到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>();

希望对大家有帮助