Skip to content

Instantly share code, notes, and snippets.

@osmyn
Created March 7, 2017 17:01
Show Gist options
  • Save osmyn/6085b1ff7bf4f226eb86461b291213da to your computer and use it in GitHub Desktop.
Save osmyn/6085b1ff7bf4f226eb86461b291213da to your computer and use it in GitHub Desktop.
Mock .Include for EF
private void HelpSetupActivitiesFakes(
List<Activity> fakeActivity,
ActivityOutcome fakeOutcome,
List<ArgumentHierarchy> fakeHierarchy)
{
var mockedActivity = RepositoryTestingHelper
.GetMockDbSet<Activity>(fakeActivity.AsQueryable());
mockedActivity.Setup(x => x.Include("InputArgument"))
.Returns(mockedActivity.Object);
mockedActivity.Setup(x => x.Include("OutputArgument"))
.Returns(mockedActivity.Object);
_mockContext.Setup(m => m.Activities)
.Returns(mockedActivity.Object);
_mockContext.Setup(m => m.ActivityOutcomes)
.Returns(RepositoryTestingHelper.GetQueryableMockDbSet(fakeOutcome));
var hierarchySet = new Mock<DbSet<ArgumentHierarchy>>();
hierarchySet.Setup(m => m.SqlQuery(It.IsAny<string>(), It.IsAny<object>()))
.Returns<string, object[]>((sql, param) =>
{
var sqlQueryMock = new Mock<DbSqlQuery<ArgumentHierarchy>>();
sqlQueryMock.Setup(m => m.AsNoTracking())
.Returns(sqlQueryMock.Object);
sqlQueryMock.Setup(m => m.GetEnumerator())
.Returns(fakeHierarchy.GetEnumerator());
return sqlQueryMock.Object;
});
_mockContext.Setup(m => m.Set<ArgumentHierarchy>())
.Returns(hierarchySet.Object);
}
[TestMethod]
[TestCategory("UnitTest")]
public void Activities_WhenTwoActive_ReturnsTwoResults()
{
//Arrange
var fakeActivity = new List<Activity>{
new Activity {
ActivityID = 1
},
new Activity{
ActivityID = 2
}
};
var fakeOutcome = Fakes.FakeOutcome();
HelpSetupActivitiesFakes(fakeActivity, fakeOutcome, Fakes.FakeHierarchy());
//act
var results = _domainDal.Activities();
//assert
Assert.AreEqual(fakeActivity.Count, results.Count);
}
public static class RepositoryTestingHelper
{
public static DbSet<T> GetQueryableMockDbSet<T>(params T[] sourceList) where T : class
{
var queryable = sourceList.AsQueryable();
var dbSet = new Mock<DbSet<T>>();
dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
dbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
dbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
dbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(queryable.GetEnumerator());
return dbSet.Object;
}
public static Mock<DbSet<T>> GetMockDbSet<T>(IQueryable<T> entities) where T : class
{
var mockSet = new Mock<DbSet<T>>();
mockSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(entities.Provider);
mockSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(entities.Expression);
mockSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(entities.ElementType);
mockSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(entities.GetEnumerator());
return mockSet;
}
}
@osmyn
Copy link
Author

osmyn commented Jun 29, 2018

For EF 6 and up, see this article for an async RepositoryTestingHelper: https://msdn.microsoft.com/en-us/data/dn314431

@hey001us
Copy link

hey001us commented Jul 18, 2018

Hi Osmyn,

Is it possible to update the missing code for the unit test class? it will be really helpful if you upload the solution folder.

@DemiDOS
Copy link

DemiDOS commented Oct 31, 2018

Hi Osmyn,

I'm trying to reuse your approach, but it does not work to me. When I mock 'Include' method, I get an error 'Message: System.NotSupportedException : Invalid setup on an extension method: x => x.Include("Tasks")'. My code is below:

var mockedActivity = RepositoryTestingHelper.GetMockDbSet(fakeActivity.AsQueryable());
mockedActivity.Setup(x => x.Include(nameof(Activity.Tasks))).Returns(mockedActivity.Object);

My DbSet is Microsoft.EntityFrameworkCore.DbSet.

@osmyn
Copy link
Author

osmyn commented Dec 26, 2018

I didn't see the notifications for your messages here, sorry. @hey001us, you can check out https://msdn.microsoft.com/en-us/data/dn314431 for more info. @DemiDOS, I'm not sure if this works in .net core - I haven't tried it there yet.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment