我正在使用实体框架核心 1.0 rc2。这是班级。
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
public DbSet<Blog> Blogs { get; set; }
}
然后注入ApplicationDbContext
到一个班级
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);
}
EDIT
In 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; }
}
然后您可以将合约注入到依赖类中
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;
}
}
然后在单元测试中您可以模拟接口
[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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)