模拟匿名回调

问题描述

我有一个类似的方法

    public class Args
    {
        public string Command {get;set;}
        public Action<string> LogHandler {get;set;}
    }

    public class MyClass
    {
        IRunner mRunner;

        public MyClass(IRunner runner)
        {
            mRunner = runner;
        }

        public string GetVersionText()
        {
            List<string> log = new List<string>();
            Args args = new Args()
            {
                Command = "getversion",LogHandler = (msg) => { log.Add(msg); }
            };
            mRunner.Execute(args);
            return log.FirstOrDefault(x => x.Contains("Version"));
        }
    }

我想测试接收到的不同输出,我将如何模拟 IRunner.Execute 方法,以便我可以控制它使用 Args 类的 Action 属性执行的操作?

解决方法

您无法真正模拟回调,因为它是在被测主题中创建的。

我建议您在 args 中捕获 Callback 并调用

args.LogHandler(your_msg_here) 

在其中(回调)

假设 IRunner 是一个注入依赖项,基于上面提供的示例的简单测试可能如下所示

// Arrange
string expected = "Message containing Version";
var runner = new Mock<IRunner>();
runner
    .Setup(_ => _.Execute(It.IsAny<Args>()))
    .Callback((Args args) => args.LogHandler(expected)); //<-- this will invoke the action

MyClass subject = new MyClass(runner.Object);

// Act
string actual = subject.GetVersionText();

//Assert - using Fluent Assertions
actual.Should().Be(expected);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...