我有一个控制台应用程序。
调用逻辑时,我传入一个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框架,所以无法模拟任何东西(我也不想)。
我知道一个解决方案是简单地创建一个与签名匹配的方法,但是我很好奇这是否可以通过上面描述的方式实现吗?
答案 0 :(得分:8)
您可以轻松地传递对Action<string>
无效的lambda表达式。
以下内容应该可以起作用,并且在被调用时什么也不做:
var myLogicClass = new LogicClass(_ => {});
舍弃(_
)是C#7的一项功能,因此因此,如果您使用的是较早版本的语言,则需要使用其他变量名。 编辑:正如@Lee在评论中指出的那样,以这种方式在旧版本的C#中使用丢弃变量是可以的-尽管您不应该命名变量{ {1}},然后稍后尝试使用。x => {}
将是一个很好的替代。
如果愿意,您始终可以创建一个方法并将其作为委托转换传入。
_
答案 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);
是正确的。