Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 单元测试包括';值不能为null';_C#_Entity Framework_Unit Testing_Moq - Fatal编程技术网

C# 单元测试包括';值不能为null';

C# 单元测试包括';值不能为null';,c#,entity-framework,unit-testing,moq,C#,Entity Framework,Unit Testing,Moq,我正在使用Moq对get调用进行单元测试。我使用Automapper从SQL数据库中提取数据,并将其映射到视图模型中。我的方法如下所示: public virtual IEnumerable<ViewParentTable> Get() { Mapper.CreateMap<ParentTable, ViewParentTable>(); Mapper.CreateMap<ChildTable, ViewChildTable>() I

我正在使用Moq对get调用进行单元测试。我使用Automapper从SQL数据库中提取数据,并将其映射到视图模型中。我的方法如下所示:

public virtual IEnumerable<ViewParentTable> Get()
{
    Mapper.CreateMap<ParentTable, ViewParentTable>();
    Mapper.CreateMap<ChildTable, ViewChildTable>()

    IEnumerable<ViewParentTable> tableresult = db.ParentTable
         .Include("ChildTable")
         .Project().To<ViewParentTable>();

    return tableresult;
}
[TestMethod]
public void Get()
{
    IEnumerable<ViewParentTable> returned = method.Get();
    mockContext.VerifyGet(m => m.ParentTable);
}
公共虚拟IEnumerable Get()
{
CreateMap();
Mapper.CreateMap()
IEnumerable tableresult=db.ParentTable
.包括(“儿童表”)
.Project().To();
返回表格结果;
}
我的测试是这样的:

public virtual IEnumerable<ViewParentTable> Get()
{
    Mapper.CreateMap<ParentTable, ViewParentTable>();
    Mapper.CreateMap<ChildTable, ViewChildTable>()

    IEnumerable<ViewParentTable> tableresult = db.ParentTable
         .Include("ChildTable")
         .Project().To<ViewParentTable>();

    return tableresult;
}
[TestMethod]
public void Get()
{
    IEnumerable<ViewParentTable> returned = method.Get();
    mockContext.VerifyGet(m => m.ParentTable);
}
[TestMethod]
公开作废获取()
{
返回的IEnumerable=method.Get();
mockContext.VerifyGet(m=>m.ParentTable);
}
我嘲笑DbContext如下:

this.mockParentSet = new Mock<DbSet<ParentTable>>();
this.mockChildSet = new Mock<DbSet<ChildTable>>();

mockParentSet.As<IQueryable<ParentTable>>().Setup(m => m.Provider).Returns(mockParentData.Provider);
mockParentSet.As<IQueryable<ParentTable>>().Setup(m => m.Expression).Returns(mockParentData.Expression);
mockParentSet.As<IQueryable<ParentTable>>().Setup(m => m.ElementType).Returns(mockParentData.ElementType);
mockParentSet.As<IQueryable<ParentTable>>().Setup(m => m.GetEnumerator()).Returns(mockParentData.GetEnumerator());

mockChildSet.As<IQueryable<ChildTable>>().Setup(m => m.Provider).Returns(mockChildData.Provider);
mockChildSet.As<IQueryable<ChildTable>>().Setup(m => m.Expression).Returns(mockChildData.Expression);
mockChildSet.As<IQueryable<ChildTable>>().Setup(m => m.ElementType).Returns(mockChildData.ElementType);
mockChildSet.As<IQueryable<ChildTable>>().Setup(m => m.GetEnumerator()).Returns(mockChildData.GetEnumerator());

this.mockContext = new Mock<MyContext>();
this.mockContext.Setup(m => m.ParentTable).Returns(mockParentSet.Object);
this.mockContext.Setup(m => m.ChildTable).Returns(mockChildSet.Object);
this.mockParentSet=new Mock();
this.mockChildSet=new Mock();
mockParentSet.As().Setup(m=>m.Provider).Returns(mockParentData.Provider);
mockParentSet.As().Setup(m=>m.Expression).Returns(mockParentData.Expression);
mockParentSet.As().Setup(m=>m.ElementType).Returns(mockParentData.ElementType);
mockParentSet.As().Setup(m=>m.GetEnumerator()).Returns(mockParentData.GetEnumerator());
mockChildSet.As().Setup(m=>m.Provider).Returns(mockChildData.Provider);
mockChildSet.As().Setup(m=>m.Expression).Returns(mockChildData.Expression);
mockChildSet.As().Setup(m=>m.ElementType).Returns(mockChildData.ElementType);
mockChildSet.As().Setup(m=>m.GetEnumerator()).Returns(mockChildData.GetEnumerator());
this.mockContext=new Mock();
this.mockContext.Setup(m=>m.ParentTable).Returns(mockParentSet.Object);
this.mockContext.Setup(m=>m.ChildTable).Returns(mockChildSet.Object);

我已经用数据填充了
ParentTable
ChildTable
。如果删除
Include(“ChildTable”)
,则测试通过。但是,当
Include(“ChildTable”)
处于适当位置时,db调用会引发异常,
值不能为null
。子表和父表中的所有不可为空的字段都已填充,因此我不确定是什么原因导致了错误。

我通过以下方法使其正常工作

mockParentSet.Setup(m=>m.Include(It.IsAny()).Returns(mockParentSet.Object);

我不知道Moq如何处理mock
DbSet
,但是对于我使用的其他mock框架,您必须意识到它们实际上不是一个数据库,因此它们不会进行必要的连接以包含相关数据。相反,你必须用完全形成的对象图加载它们,这样它们就可以像真实的数据库加入了数据一样把它吐出来。是的,我正在处理这个问题。当我构造测试数据时,我循环通过
ParentTable
的每个元素,并根据ID分配
item.ChildItems
。类似地,我循环检查
ChildTable
的每个元素,并根据id分配
item.ParentItem
。我认为这个测试不会增加任何值。你现在不是在测试AutoMapper吗?这是我正在做的一个简化版本。关键是它永远不会到达
VerifyGet
,因为它在执行该方法时抛出异常。我也有同样的问题。你成功了吗?