C# 单元测试包括';值不能为null';
我正在使用Moq对get调用进行单元测试。我使用Automapper从SQL数据库中提取数据,并将其映射到视图模型中。我的方法如下所示: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
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如何处理mockDbSet
,但是对于我使用的其他mock框架,您必须意识到它们实际上不是一个数据库,因此它们不会进行必要的连接以包含相关数据。相反,你必须用完全形成的对象图加载它们,这样它们就可以像真实的数据库加入了数据一样把它吐出来。是的,我正在处理这个问题。当我构造测试数据时,我循环通过ParentTable
的每个元素,并根据ID分配item.ChildItems
。类似地,我循环检查ChildTable
的每个元素,并根据id分配item.ParentItem
。我认为这个测试不会增加任何值。你现在不是在测试AutoMapper吗?这是我正在做的一个简化版本。关键是它永远不会到达VerifyGet
,因为它在执行该方法时抛出异常。我也有同样的问题。你成功了吗?