-
-
Save osmyn/6085b1ff7bf4f226eb86461b291213da to your computer and use it in GitHub Desktop.
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; | |
} | |
} |
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.
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.
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.
For EF 6 and up, see this article for an async RepositoryTestingHelper: https://msdn.microsoft.com/en-us/data/dn314431