我正在使用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);
}
我已经嘲笑了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);
我已为ParentTable
和ChildTable
填充了数据。如果我删除Include("ChildTable")
,则测试通过。但是,在Include("ChildTable")
就位的情况下,db调用Value cannot be null
会抛出异常。填充了Child和Parent表中的所有非可空字段,因此我不确定导致错误的原因。
答案 0 :(得分:0)
我设法通过遵循此answer
mockParentSet.Setup(m => m.Include(It.IsAny<string>())).Returns(mockParentSet.Object);