【发布时间】: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;
}
【问题讨论】:
-
如何定义
Mock<T>上的Setup方法? -
public ISetup
Setup (Expression > 表达式) -
是的:github.com/Moq/moq4/search?utf8=%E2%9C%93&q=Setup - 只需将包括
Expression在内的内容复制到您的GetMockDbContext中就可以了
标签: c# linq unit-testing generics moq