简体   繁体   中英

How to deal with multiple callbacks with Moq unit tests?

I have a mocked executor that Asserts the unit after x amount of callbacks depending on what values we give to the parameters. Here's a sample code of my unit test

[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();
}

For the moment I'm using the finalCallbackCounter parameter for it, so for example if I make the second boolean parameter true instead of false, I need to change it to 3 (I actually have more arguments and cases in my current code, I just simplified it for the question's purpose).

This way to do it feels really finnicky and not very futureproof. Is there a more elegant solution to this problem?

You could capture the ITask s, then assert at the end.

Setup is not intended for assertions:

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);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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