【发布时间】:2014-01-01 00:01:54
【问题描述】:
我有一个接口ILogger,它有一个LocalTime 属性,可以用AddToTime 向它添加时间。为了适当地模拟它,我尝试了以下方法:
int ltime = 0;
var mlog = new Mock<ILogger>();
mlog.Setup(l => l.AddToTime(It.IsAny<int>())).Callback((int s) => {ltime +=s;});
mlog.Setup(l => l.LocalTime).Returns(ltime);
虽然它可以编译,但 i 不起作用:可能是因为 Returns 在开头计算表达式 ltime,所以总是返回 0。有什么建议可以实现缩进的行为吗?
编辑:我需要这个来测试它,如下所示:
while (log.LocalTime < 1000)
{
log.AddToTime(500);
....
}
由于我将时间用于记录目的,因此不能简单地用带有局部变量的循环替换它。如果AddToTime 什么都不做,则无法正确测试循环。
【问题讨论】:
-
为什么不把它做成存根呢?我不记得有关如何在 Moq 中设置存根的正确文档,但我知道您可以做到。您尝试过这种方法吗?
-
那么,您在 SUT 中硬编码了 1000 和 500?你能描述一下这个代码的要求吗?也可以修改
Logger吗? -
您没有发布其余的测试方法。
-
我的代码中没有硬编码 1000 和 500(这是一个示例……)。我只想以这种循环执行一次但不是无限频繁的方式模拟 ILogger。
-
@JFMeier 测试是编码要求。为了帮助您编写测试,我们确实需要了解需求