Skip to content

Instantly share code, notes, and snippets.

@jhoerr
Last active June 4, 2024 23:56
Show Gist options
  • Save jhoerr/9a064c83d04076fb056b98a30f4664f9 to your computer and use it in GitHub Desktop.
Save jhoerr/9a064c83d04076fb056b98a30f4664f9 to your computer and use it in GitHub Desktop.
A mock DbContext for NSubstitute
// Caveats: does not support async enumerations, i.e. ToListAsync, ToArrayAsync
public class MockDbContext<T>
where T : Entity
{
public static ApplicationDbContext Create() => Create(new List<T>());
public static ApplicationDbContext Create(List<T> entities)
{
var queryable = entities.AsQueryable();
var mockSet = Substitute.For<DbSet<T>, IQueryable<T>>();
// Query the set
((IQueryable<T>)mockSet).Provider.Returns(queryable.Provider);
((IQueryable<T>)mockSet).Expression.Returns(queryable.Expression);
((IQueryable<T>)mockSet).ElementType.Returns(queryable.ElementType);
((IQueryable<T>)mockSet).GetEnumerator().Returns(queryable.GetEnumerator());
// Modify the set
mockSet.When(set => set.Add(Arg.Any<T>())).Do(info => entities.Add(info.Arg<T>()));
mockSet.When(set => set.Remove(Arg.Any<T>())).Do(info => entities.Remove(info.Arg<T>()));
var dbContext = Substitute.For<ApplicationDbContext>();
dbContext.Set<T>().Returns(mockSet);
return dbContext;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment