【问题标题】:Error Trying to Mock DbContext EF Core .NET 6 Visual Studio 2022尝试模拟 DbContext EF Core .NET 6 Visual Studio 2022 时出错
【发布时间】:2022-01-01 09:26:47
【问题描述】:

夹具

    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()
        {

        }
    }

数据库上下文

    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 设为虚拟,但仍然没有解决方案。谢谢!

杰森

【问题讨论】:

  • DbContext 很复杂,因此很难模拟。 EF 团队建议改用内存数据库提供程序。
  • 是的,我已经看到了。我还看到使用内存数据库更像是集成测试,而不是单元测试。我在学。学习软件开发、C#、Mocking 和单元测试等等。我实际上可能会为我的项目切换到内存中,但我仍然想了解我做错了什么来得到这个错误。谢谢。
  • 是否是集成测试取决于你如何使用它。
  • 请将错误文本复制到帖子中。屏幕截图应该是补充性的,并且仅在必要时提供。
  • 嗯,您发布的错误很清楚,您正在尝试将 Mock 分配给 T。要从 Mock 到 T,您需要使用它的 Object 属性。

标签: c# unit-testing moq xunit


【解决方案1】:

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

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

Repository = new UserStoryRepository(mockDbContext.Object);

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2020-08-14
    • 2022-06-14
    • 2022-06-17
    • 2022-01-15
    • 2020-07-24
    • 2022-10-17
    • 1970-01-01
    相关资源
    最近更新 更多