C# 使用Moq模拟实体框架,不返回DbSet<;T>;
我有一个我嘲笑和暴露的数据库集。我已经填补了一些部门的背景。现在,当我访问这些部门时,我得到空值C# 使用Moq模拟实体框架,不返回DbSet<;T>;,c#,entity-framework-6,moq,C#,Entity Framework 6,Moq,我有一个我嘲笑和暴露的数据库集。我已经填补了一些部门的背景。现在,当我访问这些部门时,我得到空值 private Mock<DbSet<Department>> departmentSet; private Mock<DemoEntities> context; [TestInitializeAttribute()] public void TestInit() { context = new Mock
private Mock<DbSet<Department>> departmentSet;
private Mock<DemoEntities> context;
[TestInitializeAttribute()]
public void TestInit()
{
context = new Mock<DemoEntities>();
departmentSet = new Mock<DbSet<Department>>();
context.Setup(c => c.Departments).Returns(departmentSet.Object);
context.Object.Departments.Add(new Department() { Name = "HR", Id = 1 });
context.Object.Departments.Add(new Department() { Name = "Operations", Id = 2 });
context.Object.SaveChanges();
var list = context.Object.Departments; //returns null
}
私有模拟部门集;
私人模拟语境;
[TestInitializeAttribute()]
公共无效测试()
{
context=newmock();
departmentSet=newmock();
Setup(c=>c.Departments).Returns(departmentSet.Object);
context.Object.Departments.Add(newdepartment(){Name=“HR”,Id=1});
Add(newdepartment(){Name=“Operations”,Id=2});
context.Object.SaveChanges();
var list=context.Object.Departments;//返回null
}
谁能告诉我我做错了什么。由于其余测试用例依赖于访问context.Object.Departments。您需要模拟
。如下所示设置
private static Mock<DbSet<T>> GetDbSetMock<T>(IEnumerable<T> items = null) where T : class
{
if (items == null)
{
items = new T[0];
}
var dbSetMock = new Mock<DbSet<T>>();
var q = dbSetMock.As<IQueryable<T>>();
q.Setup(x => x.GetEnumerator()).Returns(items.GetEnumerator);
return dbSetMock;
}
var mockContext = new Mock<MyDbContext>();
var users = new List<User> { new User { Email = "my@email.com", Id = 1 } };
mockContext.Setup(x => x.Set<User>()).Returns(GetDbSetMock(users).Object);
private static Mock GetDbSetMock(IEnumerable items=null),其中T:class
{
if(items==null)
{
项目=新的T[0];
}
var dbSetMock=new Mock();
var q=dbSetMock.As();
q、 设置(x=>x.GetEnumerator())。返回(items.GetEnumerator);
返回dbSetMock;
}
var mockContext=new Mock();
var users=新列表{新用户{电子邮件=”my@email.com,Id=1};
mockContext.Setup(x=>x.Set()).Returns(GetDbSetMock(users.Object);
您需要模拟。如下设置
private static Mock<DbSet<T>> GetDbSetMock<T>(IEnumerable<T> items = null) where T : class
{
if (items == null)
{
items = new T[0];
}
var dbSetMock = new Mock<DbSet<T>>();
var q = dbSetMock.As<IQueryable<T>>();
q.Setup(x => x.GetEnumerator()).Returns(items.GetEnumerator);
return dbSetMock;
}
var mockContext = new Mock<MyDbContext>();
var users = new List<User> { new User { Email = "my@email.com", Id = 1 } };
mockContext.Setup(x => x.Set<User>()).Returns(GetDbSetMock(users).Object);
private static Mock GetDbSetMock(IEnumerable items=null),其中T:class
{
if(items==null)
{
项目=新的T[0];
}
var dbSetMock=new Mock();
var q=dbSetMock.As();
q、 设置(x=>x.GetEnumerator())。返回(items.GetEnumerator);
返回dbSetMock;
}
var mockContext=new Mock();
var users=新列表{新用户{电子邮件=”my@email.com,Id=1};
mockContext.Setup(x=>x.Set()).Returns(GetDbSetMock(users.Object);
我相信你必须这样使用它:context.Object.Departments.ToList()
如果我放置ToList(),它会抛出空指针异常。看到这个我相信你必须这样使用它:context.Object.Departments.ToList()
如果我放置ToList(),它会抛出空指针异常。请查看这个context.Setup(x=>x.Departments)。返回(GetDbSetMock(departments.Object);修复了它。谢谢context.Setup(x=>x.departments)。Returns(GetDbSetMock(departments.Object);修复了它。谢谢