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;
}
}
@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