【发布时间】:2017-04-04 09:45:03
【问题描述】:
我正在使用 mongo db 编写单元测试,我需要以某种方式测试适用于从 mongo 返回的数据的方法。例如方法
IFindFluent<Transcript, Transcript> GetTranscriptByUserId(int userId);
应该返回一些成绩单。但相反,它返回具有几个道具的接口 - Filter、Options、Sort 和其他。
我要测试Paginator<T>类的方法Paginane
public PaginatedObject<T> Paginate(IFindFluent<T,T> items, int limit, int page)
{
if (limit == 0)
{
limit = 10;
}
int count = (int)items.Count();
var lastPage = (count / limit) + 1;
if (page <= 0)
{
page = 1;
}
if (page > lastPage)
{
page = lastPage;
}
var request = items.Skip((page - 1) * limit).Limit(limit);
var itemsToReturn = request.ToList();
var pages = new PaginatedObject<T>
{
Entries = itemsToReturn,
Limit = limit,
Total = count,
Page = page
};
return pages;
}
第一个参数是接口IFindFluent<T,T> 项目。所以,当我调用Count、Skip 和Limit 时,我应该模拟它以返回项目。但是这些方法很容易被嘲笑。
mockIfindFluent = new Mock<IFindFluent<Transcript, Transcript>>();
mockIfindFluent.Setup(s => s.Limit(It.IsAny<int>())).Returns(mockIfindFluent.Object);
mockIfindFluent.Setup(i => i.Skip(It.IsAny<int>())).Returns(mockIfindFluent.Object);
mockIfindFluent.Setup(i => i.Count(CancellationToken.None)).Returns(3);
我打电话给ToList()时遇到的真正问题。
我遇到异常,我无法模拟不属于模型的属性等等。
【问题讨论】:
-
看看它是如何被开发者测试的,看看他们是否提供了足够的例子让你实现你想要的github.com/mongodb/mongo-csharp-driver/blob/master/tests/…
-
显示minimal reproducible example,说明您要测试的内容。这应该有助于提供更好的答案。
-
ToList是接口上的扩展方法,不能用 moq 模拟。在查看源代码之后,仅仅为了单元测试来模拟它的功能似乎非常复杂。我建议在您控制的抽象背后抽象出所需的功能,以便您更容易模拟和测试。您应该避免模拟/测试您无法控制的代码。 -
谢谢我也看到了这个答案,并决定避免在 repo 之外使用这个界面。
标签: c# mongodb unit-testing moq mongodb-.net-driver