尝试模拟 DbContext EF Core .NET 6 时出错 Visual Studio 2022

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

夹具

    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();
        }

错误

我正在使用 Moq 来尝试模拟我的 DbContext 和 DbSet,这样我就可以对我的存储库进行单元测试。

有人可以帮我了解问题所在以及如何解决吗?正如我在其他帖子中看到的那样,我已经确保将 DbSet 设为虚拟,但仍然没有解决方案。谢谢!

贾森

问题是您将 Mock 类型的对象分配给变量 mockDbContext。 UserStoryRepository 在构造函数中需要一个 UserStoryContext 类型的对象。

您需要将存储库的构造更改为:

Repository = new UserStoryRepository(mockDbContext.Object);