我的界面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);
虽然它编译,但我不起作用:可能是因为Returns
在开头评估表达式ltime
,因此总是返回0
。任何建议如何实现缩进行为?
编辑:我需要这个来测试它,看起来像这样:
while (log.LocalTime < 1000)
{
log.AddToTime(500);
....
}
由于我将时间用于记录目的,因此不能简单地用带有局部变量的循环替换它。如果AddToTime
什么都不做,则无法正确测试循环。
答案 0 :(得分:4)
这是一个测试,我建议你避免测试中的任何逻辑。只有你应该有一些逻辑的地方是SUT你正在测试。否则,模拟记录器的实现会潜入其他类的测试中。只需设置您期望的值:
int ltime = 0;
int timeToAdd = 2;
var mlog = new Mock<ILogger>();
mlog.Setup(l => l.AddToTime(timeToAdd));
mlog.Setup(l => l.LocalTime).Returns(ltime + timeToAdd);
我甚至会尝试避免上次返回设置计算并将其替换为常量预期值。但我需要更多地了解您正在测试的逻辑。
答案 1 :(得分:0)
您可以使用Returns
方法代替Callback
这里的例子:
Settings variable values in a Moq Callback() call