单元测试获取包含'值不能为空'

时间:2016-06-17 15:43:14

标签: c# entity-framework unit-testing moq

我正在使用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);

我已为ParentTableChildTable填充了数据。如果我删除Include("ChildTable"),则测试通过。但是,在Include("ChildTable")就位的情况下,db调用Value cannot be null会抛出异常。填充了Child和Parent表中的所有非可空字段,因此我不确定导致错误的原因。

1 个答案:

答案 0 :(得分:0)

我设法通过遵循此answer

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