gpt4 book ai didi

c# - 如何模拟 dbcontext?

转载 作者:太空狗 更新时间:2023-10-29 22:15:44 25 4
gpt4 key购买 nike

我在 .net core 1.0 rc2 中使用 Entity Framework 7。这是类(class)。

public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{

}
public DbSet<Blog> Blogs { get; set; }
}

然后将 ApplicationDbContext 注入(inject)到一个类中

public class BtnValidator
{
private readonly ApplicationDbContext _dbContext;
public BtnValidator(ApplicationDbContext dbContext)
{
_dbContext = dbContext;
}
}

不确定如何在单元测试方法中模拟它。

[Fact]
public void Ensure_Proper_Btn_Validated_Return_True()
{
var dbContext = mockup(ApplicationDbContext); //how

var validator = new BtnValidator(dbContext);
var results = validator.IsValid("1234");
Assure.True(results);
}

编辑

BtnValidator 中,我有访问 dbContext 的代码。

public IsValid(string ID)
{
var results = _dbContext.Blogs.First(x => x.ID);
//
}

最佳答案

您可以抽象您的 DbContext 以使其可模拟。

public interface IDbContext {
DbSet<Blog> Blogs { get; set; }
//...other properties and members needed for db context
int SaveChanges();
}

public class ApplicationDbContext : DbContext, IDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) {

}

public DbSet<Blog> Blogs { get; set; }
}

然后你可以将契约注入(inject)依赖类

public class BtnValidator {
private readonly IDbContext _dbContext;

public BtnValidator(IDbContext dbContext) {
_dbContext = dbContext;
}

public bool IsValid(string ID) {
var result = _dbContext.Blogs.FirstOrDefault(x => x.ID == ID);
return result != null;
}
}

然后在你的单元测试中你可以模拟接口(interface)

[Fact]
public void Ensure_Proper_Btn_Validated_Return_True() {
//Arrange
var id = "1234"
var blogsTestData = new List<Blog>(){ new Blog { ID = id } };
var blogs = MockDbSet(blogsTestData);
//Set up mocks for db sets
var dbContext = new Mock<IDbContext>();
dbContext.Setup(m => m.Blogs).Returns(blogs.Object);

var validator = new BtnValidator(dbContext.Object);

//Act
var results = validator.IsValid(id);

//Assert
Assure.True(results);
}

Mock<DbSet<T>> MockDbSet<T>(IEnumerable<T> list) where T : class, new() {
IQueryable<T> queryableList = list.AsQueryable();
Mock<DbSet<T>> dbSetMock = new Mock<DbSet<T>>();
dbSetMock.As<IQueryable<T>>().Setup(x => x.Provider).Returns(queryableList.Provider);
dbSetMock.As<IQueryable<T>>().Setup(x => x.Expression).Returns(queryableList.Expression);
dbSetMock.As<IQueryable<T>>().Setup(x => x.ElementType).Returns(queryableList.ElementType);
dbSetMock.As<IQueryable<T>>().Setup(x => x.GetEnumerator()).Returns(() => queryableList.GetEnumerator());
dbSetMock.Setup(x => x.Create()).Returns(new T());

return dbSetMock;
}

关于c# - 如何模拟 dbcontext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37630564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com