[英]How to deal with multiple callbacks with Moq unit tests?
我有一个模拟的执行器,它根据我们给参数的值在 x 次回调后断言单元。 这是我的单元测试的示例代码
[Test]
[TestCase("foo", false, 2)]
[TestCase("foo", true, 3)]
public void CommandLineShouldBeValidTest(string parameter1, bool parameter2, int finalCallbackCounter)
{
int initialCallbackCounter = 0;
var executorMock = new Mock<ITaskExecutor>();
executorMock.Setup(m => m.Execute(It.IsAny<IExecutionContext>(), It.IsAny<ITask>())).Callback<IExecutionContext, ITask>((c, it) =>
{
var p = (ProcessTask)it;
initialCallbackCounter++;
if (initialCallbackCounter == finalCallbackCounter)
{
Assert.AreEqual(expectedCommandLine, p.CommandLine);
}
});
var macro = new Macro(parameter1, parameter2, mock.Object);
macro.Execute();
}
目前我正在使用finalCallbackCounter
参数,例如,如果我将第二个 boolean 参数设置为 true 而不是 false,我需要将其更改为 3(实际上我在当前代码中有更多 arguments 和案例,我只是出于问题的目的对其进行了简化)。
这种方式感觉真的很笨拙,而且不是很有未来感。 这个问题有更优雅的解决方案吗?
您可以捕获ITask
,然后在最后断言。
Setup
不适用于断言:
var capturedTasks = new List<ITask>();
var executorMock = new Mock<ITaskExecutor>();
executorMock.Setup(m => m.Execute(
It.IsAny<IExecutionContext>(),
Capture.In(capturedTasks)));
var macro = new Macro(mock.Object);
macro.Execute();
if (capturedTasks.Count >= finalCallbackCounter)
{
var p = (ProcessTask)capturedTasks[finalCallbackCounter - 1];
Assert.AreEqual(expectedCommandLine, p.CommandLine);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.