我有一个具有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
不执行任何操作,则无法正确测试循环。 最佳答案
这是一个测试,建议您在测试中避免任何逻辑。您要测试的只有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);
我什至会尝试避免最后一次返回设置计算,而用恒定的期望值替换它。但是我需要更多地了解您正在测试的逻辑。
关于c# - 如何保存值以便以后返回?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20562766/