Search code examples
c#unit-testingmoqxunit

Error Trying to Mock DbContext EF Core .NET 6 Visual Studio 2022


Fixture

    public class RepositoryFixture : IDisposable
    {
        public RepositoryFixture()
        {
            var moviesMock = CreateDbSetMock(GetFakeListOfMovies());
            var mockDbContext = new Mock<UserStoryContext>();
            mockDbContext.Setup(x => x.UserStories).Returns(moviesMock.Object);
            Repository = new UserStoryRepository(>>>mockDbContext<<<); // error on this line, see mockDbContext
        }

        public UserStoryRepository Repository { get; set; }

        private IEnumerable<UserStory> GetFakeListOfMovies()
        {
            var movies = new List<UserStory>
            {
                new UserStory {UserStoryId = 1, Title = "Movie 1"},
                new UserStory {UserStoryId = 2, Title = "Movie 2"},
                new UserStory {UserStoryId = 3, Title = "Movie 3"}
            };

            return movies;
        }

        private static Mock<DbSet<T>> CreateDbSetMock<T>(IEnumerable<T> elements) where T : class
        {
            var elementsAsQueryable = elements.AsQueryable();
            var dbSetMock = new Mock<DbSet<T>>();

            dbSetMock.As<IQueryable<T>>().Setup(m => m.Provider).Returns(elementsAsQueryable.Provider);
            dbSetMock.As<IQueryable<T>>().Setup(m => m.Expression).Returns(elementsAsQueryable.Expression);
            dbSetMock.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(elementsAsQueryable.ElementType);
            dbSetMock.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(elementsAsQueryable.GetEnumerator());

            return dbSetMock;
        }
        public void Dispose()
        {

        }
    }

DbContext

    public class UserStoryContext : DbContext
    {
        public virtual DbSet<UserStoryTheme> UserStoryThemes { get; set; }
        public virtual DbSet<UserStoryChampion> UserStoryChampions { get; set; }
        public virtual DbSet<UserStory> UserStories { get; set; }

        public UserStoryContext(DbContextOptions<UserStoryContext> options)
           : base(options)
        {
            base.Database.EnsureCreated();
        }

Error enter image description here

I'm using Moq to try and mock my DbContext and DbSet so I can unit test my repository.

Can someone please help me understand what's wrong and how to fix? I've made sure to make the DbSet virtual as I've seen in other posts, but still no resolution. Thanks!

Jason


Solution

  • The problem is that you're assigning an object of type Mock to the variable mockDbContext. The UserStoryRepository is expecting an object of type UserStoryContext in the constructor.

    You need to change the construction of the repository to:

    Repository = new UserStoryRepository(mockDbContext.Object);