【发布时间】:2016-09-12 21:12:58
【问题描述】:
我创建了一个扩展方法,让我可以将 List 视为 DbSet 以进行测试(实际上,我在另一个关于堆栈溢出的问题中发现了这个想法,它非常有用)。编码如下:
public static DbSet<T> AsDbSet<T>(this List<T> sourceList) where T : class
{
var queryable = sourceList.AsQueryable();
var mockDbSet = new Mock<DbSet<T>>();
mockDbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
mockDbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
mockDbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
mockDbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(queryable.GetEnumerator());
mockDbSet.Setup(d => d.Add(It.IsAny<T>())).Callback<T>(sourceList.Add);
mockDbSet.Setup(d => d.Find(It.IsAny<object[]>())).Callback(sourceList.Find);
return mockDbSet.Object;
}
我使用 Add 已经有一段时间了,效果很好。但是,当我尝试为 Find 添加回调时,我收到一个编译器错误,指出它无法将方法组转换为操作。为什么sourceList.Add是一个Action,而sourceList.Find是一个方法组?
我承认我对 C# 委托并不是特别熟悉,所以我很可能遗漏了一些非常明显的东西。提前致谢。
【问题讨论】:
标签: entity-framework unit-testing delegates entity-framework-6 moq