使用FakeDbSets模拟DbContext

时间:2015-10-02 13:52:34

标签: c# entity-framework mocking

我想使用伪造的$.each(dateArray, function (i, el) { // Here I have to establish the value of count arrOfCounts.push(count); } }); 创建一个模拟的DbContext。 所以我创建了一个名为DbSets的类,它实现了FakeDbSet<T>

现在我已经创建了IDbSet<T>,其中包含伪造的FakeDbContext。 我使用Ninject将DbSet<T>绑定到DbContext,如下所示:

FakeDbContext

当我调用我的WebAPI项目时,我将获得Kernel.Bind<DbContext>().To<FakeDbContext>(); 我无法创建数据库的权限。

这是我的FakeDbContext:

SqlException

(注意:UserDbSet只使用默认数据填充public class FakeDbContext : DbContext { public virtual IDbSet<User> Users => new UserDbSet(); } 。)

如何将HashSet<User>设置为不与真实数据库创建/交互?如果我从FakeDbContext Ninject中移除: DbContext,则说明它必须可转换为FakeDbContext

2 个答案:

答案 0 :(得分:2)

尝试禁用数据库初始化

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

// .....

答案 1 :(得分:0)

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

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

覆盖Set<T>方法解决了问题。