使用 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>
方法解决了问题。
我想使用伪造的 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>
方法解决了问题。