繁体   English   中英

如何使用 Moq 单元测试处理多个回调?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM