我有一个具有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/

10-12 12:44
查看更多