如何伪造Action <string>

时间:2019-07-22 16:53:22

标签: c#

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

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

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

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

static void WriteToConsole(string s)
{
    Console.WriteLine(s);
}

很抱歉,如果代码不是完美的,我这里没有Visual Studio,因此是从内存中完成的。

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

我想在单元测试中做的是

var myLogicClass = new LogicClass(new Action<string>());

但这不起作用。

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

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

2 个答案:

答案 0 :(得分:8)

您可以轻松地传递对Action<string>无效的lambda表达式。

以下内容应该可以起作用,并且在被调用时什么也不做:

var myLogicClass = new LogicClass(_ => {});

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

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

_

答案 1 :(得分:0)

如果您想验证操作是否已被调用:

a.map(x => (smth.functionWithSomeVeryUniqueName)(x))

或者,为简便起见:

var actionInvoked = false;
Action<string> action = (s) => actionInvoked = true; 
var subject = new LogicClass(action);

然后您可以断言var subject = new LogicClass((s) => actionInvoked = true); 是正确的。