如何伪造Action <string>

MyD*_*ons 0 c#

我有一个控制台应用程序。

当我调用逻辑时,我传入一个Action以便显示到控制台。

我的控制台应用程序看起来有点像

static Main(string[] args)
{
    var myLogicClass = new LogicClass(WriteToConsole);
    //…. more code
}

static void WriteToConsole(string s)
{
    Console.WriteLine(s);
}
Run Code Online (Sandbox Code Playgroud)

抱歉,如果代码不是完美的,我这里没有Visual Studio,因此只能从内存中进行操作。

现在,我需要测试我的代码。我想用duff方法模拟WriteToConsole,该方法实际上什么也没做。

我想做的是在单元测试中

var myLogicClass = new LogicClass(new Action<string>());
Run Code Online (Sandbox Code Playgroud)

但这是行不通的。

我没有使用任何DI框架,所以无法模拟任何东西(我也不想)。

我知道一个解决方案是简单地创建一个与签名匹配的方法,但是我很好奇这是否可以通过上面描述的方式来实现吗?

Jon*_*ase 8

您可以传入一个不做任何事情的lambda表达式Action<string>

遵循以下内容的东西应该起作用,并且在调用时什么也不做:

var myLogicClass = new LogicClass(_ => {});
Run Code Online (Sandbox Code Playgroud)

舍弃(_)是C#7的功能,因此,如果您要放弃早期版本的语言,则需要使用另一个变量名。x => {}将是一个很好的替代品。编辑:正如@Lee在注释中指出的那样,以这种方式在旧版本的C#中使用丢弃变量是可以的-尽管您不应该命名变量_然后在以后尝试使用它。

如果愿意,您可以始终创建一个方法,并将其作为委托转换传入。

void DoNothing(string val) { return; }
...
var myLogicClass = new LogicClass(DoNothing);
Run Code Online (Sandbox Code Playgroud)

  • *“我知道一个解决方案是简单地创建一个与签名匹配的方法,但是我很好奇是否可以通过上面介绍的方式实现”(*)暗示您不需要进行编辑。我很好奇@MyDaftQuestions为什么认为这不是很好的代码。 (2认同)