I am unit testing a get call using Moq. I am using Automapper to pull data from a SQL database and map it into my view models. My method looks something like this:
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;
}
And my test looks something like this:
[TestMethod]
public void Get()
{
IEnumerable<ViewParentTable> returned = method.Get();
mockContext.VerifyGet(m => m.ParentTable);
}
I have mocked the DbContext as such:
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);
I have filled both ParentTable
and ChildTable
with data. If I remove the Include("ChildTable")
, the test passes. However, with the Include("ChildTable")
in place an exception is thrown on the db call, Value cannot be null
. All non-nullable fields in both Child and Parent tables are populated, so I'm not sure what is causing the error.