【问题标题】:generics - How to pass a lambda expression into a method?泛型 - 如何将 lambda 表达式传递给方法?
【发布时间】:2014-08-25 04:53:23
【问题描述】:

我有许多要为其设置单元测试的业务服务类。

在模拟数据时,我有一组相当通用的方法。一个提供模拟的 dbSet,一个提供服务。

我还没有设法使通用的一件事是模拟数据上下文的过程。

现在我有类似的东西:

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);

并且能够将所有这些通用代码放入帮助程序类中。

不过,我不知道如何实现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;
}

【问题讨论】:

标签: c# linq unit-testing generics moq


【解决方案1】:

你的方法的参数应该和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;
}

【讨论】:

  • 这与我上面发布的非常相似,所以我将其标记为答案。我在原始问题中更新的代码在 dbSet 对象中传递。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多