我正在尝试对以下方法进行单元测试(repo 被模拟):
public List<StatusLevelDTO> FindAllTranslated(string locale)
{
var statusLevels = Context.StatusLevels
.IncludeFilter(sl => sl.Translations
.Where(t => t.Locale.Name == locale))
.Where(sl => !sl.Deleted)
.ToList();
return Mapper.Map<List<StatusLevelDTO>>(statusLevels);
}
它使用了一个名为 EntityFramework Plus 的第三方库,我相信它使用投影来过滤包含的实体。
现在,当我运行整个项目时,一切都很好,但是单元测试似乎忽略了这个方法并返回了所有内容。
有没有办法让IncludeFilter
扩展方法简单地完成它的工作?
模拟配置:
public static DbSet<T> GetMockedDbSet<T>(List<T> sourceList) where T : class
{
var queryableList = sourceList.AsQueryable();
var dbSetMock = new Mock<DbSet<T>>();
dbSetMock.As<IQueryable<T>>().Setup(x => x.GetEnumerator()).Returns(() => queryableList.GetEnumerator());
dbSetMock.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryableList.Provider);
dbSetMock.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryableList.Expression);
dbSetMock.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryableList.ElementType);
dbSetMock.Setup(d => d.Add(It.IsAny<T>())).Callback<T>(s => sourceList.Add(s));
dbSetMock.Setup(d => d.Include(It.IsAny<string>())).Returns(dbSetMock.Object);
return dbSetMock.Object;
}
一个可能的重复项,例如Mocking Extension Methods with Moq并不能回答我的问题,因为我不是在问如何模拟/存根扩展方法。问题是:是否可以在不模拟/存根的情况下以某种方式调用其逻辑?