泛型-如何将lambda表达式传递到方法中

本文关键字:方法 表达式 lambda 泛型 | 更新日期: 2023-09-27 18:19:26

我有许多业务服务类正在为它们设置单元测试。

在模拟数据时,我得到了一组相当通用的方法。一个提供模拟数据库集,一个提供服务。

有一件事我还没能做到通用化,那就是模拟数据上下文的过程。

现在我有这样的东西:

mockDbSet = MyHelper.GetMockedDbSet(myData); // myData is an IQueryable List <T>
mockContext = new Mock<MyDataContext>();
// A handful of general .Setup lines snipped here
mockContext.Setup(m => m.Person).Returns(mockDbSet.Object);

每个单元测试夹具都是相同的,除了最后一行,

m => m.Person

被替换为其他实体。

所有实体共享相同的基类。

我想要的是这样的东西:

mockContext = MyHelper.GetMockedDbContext(m => m.Person);

并且能够将所有这些通用代码放入helper类中。

不过,我不知道如何实现GetMockedDbContext

到目前为止,我得到的是:

public static Mock<MyDataContext> GetMockedDbContext(Func<MyDataContext, object> func)
{
    var context = new Mock<MyDataContext>();
    // Now what?
    return context;
}

更新:以下是我到目前为止所做的工作。类似这样的内容被作为回答发布,然后被删除。这似乎奏效了。

public static Mock<MyDataContext> GetMockedDbContext<TResult>(Expression<Func<MyDataContext, TResult>> func, TResult result)
{
    var context = new Mock<MyDataContext>();
    // Snipped out stuff
    context.Setup(func).Returns(result);
    return context;
}

泛型-如何将lambda表达式传递到方法中

您的方法的参数应该与Setup方法的参数类型相同,这意味着您的方法也必须是泛型的:

public static Mock<MyDataContext> GetMockedDbContext<T>(Expression<Func<MyDataContext, T>> func)
{
    var context = new Mock<MyDataContext>();
    // Now what?
    context.Setup(func).Returns(mockDbSet.Object);
    return context;
}