尝试模拟 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);
夹具
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);