【发布时间】: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