FakeItEasy - 是否有可能拦截一个方法并将其替换为我自己的实现?

时间:2012-10-19 18:51:56

标签: c# unit-testing mocking fakeiteasy

我有以下界面:

public interface IOuputDestination
{
    void Write(String s);
}

在我的单元测试中,我这样嘲笑:

var outputDestination = A.Fake<IOutputDestination>();

我想要做的是拦截Write方法,以便它使用我在测试中定义的自定义实现。像这样:

String output = "";
A.CallTo(() => outputDestination.Write(A<String>.Ignored)).Action(s => output += s);
              //Is something like this even possible ? ----^

此处Action方法不存在,但我希望发生的是传递到outputDestination.Write的任何参数都会重定向到我的自定义操作。这可能是使用FakeItEasy吗?如果没有,是否有另一个允许这种行为的模拟框架?

2 个答案:

答案 0 :(得分:8)

您可以使用Invokes获得该行为:

String output = "";
A.CallTo(() => outputDestination.Write(A<String>.Ignored))
    .Invokes((string s) => output += s);

答案 1 :(得分:0)

创建后,您并未真正展示自己如何使用outputDestination。你会把它注入一些被测试的方法吗?如果是这样,那么如果您创建一个实现IOutputDestination且包含Write()所需实现的特制类,而不是创建假的,那该怎么办?

我想这取决于您需要在假货上验证的其他行为(如果有的话)。没有更多的背景,很难知道。

相关问题