使用 FakeDbSets 模拟 DbContext

Mock DbContext with FakeDbSets

我想使用伪造的 DbSets 创建一个模拟的 DbContext。 所以我创建了一个名为 FakeDbSet<T> 的 class,它实现了 IDbSet<T>.

现在我创建了一个 FakeDbContext,里面有那些伪造的 DbSet<T>。 我用 Ninject 将 DbContext 绑定到 FakeDbContext,如下所示:

Kernel.Bind<DbContext>().To<FakeDbContext>();

当我调用我的 WebAPI 项目时,我会得到一个 SqlException 我没有创建数据库的权限。

这是我的 FakeDbContext:

public class FakeDbContext : DbContext
{
    public virtual IDbSet<User> Users => new UserDbSet();
}

(注意:UserDbSet 只是用默认数据填充 HashSet<User>。)

如何使用 真实 数据库将 FakeDbContext 设置为非 create/interact?如果我从 FakeDbContext 中删除 : DbContext Ninject 表示它必须可以转换为 DbContext

尝试禁用数据库初始化

public class FakeDbContext : DbContext
{
    static FakeDbContext()
    {
        Database.SetInitializer<FakeDbContext>(null);
    }

    public FakeDbContext() { }

    public virtual IDbSet<User> Users => new UserDbSet();
}

这个测试对我有效:

[Fact]
public void Test1()
{
    var kernel = new StandardKernel();
    kernel.Bind<RealContext>().To<FakeDbContext>();

    var result = kernel.Get<Wrapper>();

    var user = result.context.Users.Add(new User());
    Assert.NotNull(user);
}

public class Wrapper
{
    public readonly RealContext context;

    public Wrapper(RealContext context)
    {
        this.context = context;
    }
}

public class RealContext : DbContext
{
    public virtual IDbSet<User> Users => new UserDbSet();
}

public class FakeDbContext : RealContext
{
    static FakeDbContext()
    {
        Database.SetInitializer<FakeDbContext>(null);
    }

    public override IDbSet<User> Users => new UserDbSet();
}

// .....

我终于在 qujck 的帮助下修复了它。

因为我的 DbContext 试图连接到数据库而出现异常的原因是,我正在使用正在访问数据库的 DbContext.Set<T>

重写 Set<T> 方法解决了问题。