C# 具有最小起订量的单元测试通用方法

C# 具有最小起订量的单元测试通用方法,c#,unit-testing,moq,C#,Unit Testing,Moq,我有一个从表中返回记录列表的通用方法: public List<T> GetValidRecords<T>() where T: class, IGetListOfTables { try { return _context.Set<T>().Where(x => x.Valid == 1).ToList(); } catch (Exception ex) { throw new E

我有一个从表中返回记录列表的通用方法:

public List<T> GetValidRecords<T>() where T: class, IGetListOfTables
{
    try
    {
        return _context.Set<T>().Where(x => x.Valid == 1).ToList();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}
public List GetValidRecords(),其中T:class,igetListTables
{
尝试
{
返回_context.Set(),其中(x=>x.Valid==1.ToList();
}
捕获(例外情况除外)
{
抛出新异常(例如消息);
}
}
我对这种方法进行了单元测试:

[TestMethod]
public void GetValidRecords()
{
    var data = new List<tableName>
    {
        new tableName() {Valid= 1},
        new tableName() {Valid= 1}
    }.AsQueryable();

    var mockSet = new Mock<DbSet<tableName>>();
    mockSet.As<IQueryable<tableName>>().Setup(m => m.Provider).Returns(data.Provider);
    mockSet.As<IQueryable<tableName>>().Setup(m => m.Expression).Returns(data.Expression);
    mockSet.As<IQueryable<tableName>>().Setup(m => m.ElementType).Returns(data.ElementType);
    mockSet.As<IQueryable<tableName>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

    var mockContext = new Mock<ALMONEntitiesNew>();
    mockContext.Setup(x => x.tableName).Returns(mockSet.Object);
    var database = new Database(mockContext.Object);
    var numberOfRecords = database.GetValidRecords<tableName>();
    Assert.AreEqual(2, numberOfRecords.Count, "Wrong number of valid records.");
}
[TestMethod]
公共无效GetValidRecords()
{
var数据=新列表
{
新tableName(){Valid=1},
新tableName(){Valid=1}
}.AsQueryable();
var mockSet=new Mock();
mockSet.As().Setup(m=>m.Provider).返回(data.Provider);
mockSet.As().Setup(m=>m.Expression).Returns(data.Expression);
mockSet.As().Setup(m=>m.ElementType).Returns(data.ElementType);
mockSet.As().Setup(m=>m.GetEnumerator()).Returns(data.GetEnumerator());
var mockContext=new Mock();
Setup(x=>x.tableName).Returns(mockSet.Object);
var database=新数据库(mockContext.Object);
var numberOfRecords=database.GetValidRecords();
AreEqual(2,numberOfRecords.Count,“有效记录的数目错误”);
}
问题是我从表中得到的是实际记录数,而不是moqed数。
如何修复它?

您需要从GetValidRecords方法中获得对EF实现的所有依赖性,尤其是\u上下文,否则特定于EF的实现将不断渗入您的单元测试。为了将GetValidRecords作为一个单元进行测试,您需要使其能够独立运行。如果您想按原样测试它,我建议使用集成测试,它实际上是从数据库中检索记录并断言它们返回正常-这不需要使用任何模拟框架,并且是测试此功能的一种完全正常的方法

关于让GetValidRecords独立的主题,我看到DbSet实现了IEnumerable,所以您可能需要这样的东西:

public static List<T> GetValidRecords<T>(this IEnumerable<T> source) where T: class, IGetListOfTables
{
    if (null == source)
    {
        throw new ArgumentNullException("source");
    }

    return source.Where(x => x.Valid == 1).ToList();
}
公共静态列表GetValidRecords(此IEnumerable源代码),其中T:class,IGETListFTables
{
if(null==源)
{
抛出新的ArgumentNullException(“源”);
}
返回source.Where(x=>x.Valid==1.ToList();
}

对于
集合
method@JordyLangen您能提供示例吗?回答得很好,但在您的示例代码中,try/catch正在吞噬原始异常的堆栈跟踪,应该删除它。@MikeStockdale是的,我知道-只是想继续讨论这个主题。谢谢你注意到这一点,我想最好解决一下。行。