Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Moq模拟实体框架,不返回DbSet<;T>;_C#_Entity Framework 6_Moq - Fatal编程技术网

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);修复了它。谢谢