使用Ninject时,如何根据接口模拟上下文



我有我的普通实体框架上下文,这就是这样:

public class LikvidoWebsitesApiContext : IdentityDbContext<ApplicationUser>, ILikvidoWebsitesApiContext
{   
   // code
}

我制作了一个接口,该接口具有我的DBSets

在我的普通解决方案中,我将其设置为 ninject 这样:

kernel.Bind<ILikvidoWebsitesApiContext>().To<LikvidoWebsitesApiContext>().InRequestScope();

我通过在构造函数中添加ILikvidoWebsitesApiContext来使用服务中的上下文,然后我可以使用数据库。

我的问题是:如何在设备测试中进行设置?

我试图做以下操作:

kernel.Bind(typeof(ILikvidoWebsitesApiContext))
            .To(typeof(Mock<LikvidoWebsitesApiContext>))
            .Register(true);

(使用Moq框架(

但是,这给出了:

system.invalidcastException:'无法施放类型的对象'moq.mock`1 [likvido.domain.services.data.likvidowebesitesapicontext]''>

哪个确实有意义,但是我不确定如何修复它?

快速查看ninject wiki,我遇到了

提供商,工厂方法和激活上下文

他们在哪里显示如何使用Provider来构建实例。

按照Wiki中的建议,建议扩展Provider<T>,其中包括强键入。

public MoqContextProvider : Provider<ILikvidoWebsitesApiContext> {
    protected override ILikvidoWebsitesApiContext CreateInstance(IContext context) {
        var mock = new Mock<ILikvidoWebsitesApiContext>();
        // Set up of mock members
        return mock.Object;
    }
}

,然后只是插入容器

的问题
kernel.Bind<ILikvidoWebsitesApiContext>().ToProvider(new MoqContextProvider());

也有关于使用工厂方法

的建议

编写IProvider实现的更轻的替代品是将服务绑定到委托方法。

kernal.Bind<ILikvidoWebsitesApiContext>()
    .ToMethod(context => {
        var mock = new Mock<ILikvidoWebsitesApiContext>();
        // Set up of mock members
        return mock.Object;    
    });

提供的Func将绑定到延期绑定的服务类型,并在需要新的实例(即ILikvidoWebsitesApiContext(时拨打。

请记住,当使用量量时,您需要设置模拟的所需行为。

最新更新