使用Fakes时,“模拟”调用正在测试的方法中的私有方法

时间:2013-09-30 19:51:28

标签: c# unit-testing microsoft-fakes

我正在使用Microsoft Fakes来分析一个很长的方法,重新考虑它并更好地理解它。我已经隔离了几行看起来像是一个很好的候选者,可以重新计入一个单独的私有方法。我采取的方法不是手动修改代码(只使用开箱即用的重新分解),以最大限度地减少我的更改后果。这是一个问题: 一旦我将有问题的行重新分解为一个单独的私有方法,我想消除与这些行相关的所有设置代码(以及包装它们的新私有方法),并通过提供默认值来“模拟”该调用罐头答案。这有点像存根/垫片,但我们正在讨论被测试的类,所以我需要类来执行它的代码,除了“模拟”方法。在Rhino Mocks中,我会使用PartialMock来隐藏这些调用(在将它们设置为虚拟之后!!!)但是Fakes可以在这种情况下帮助我吗?感谢。

2 个答案:

答案 0 :(得分:5)

如果要覆盖私有方法(模拟私有方法),可以使用填充程序

执行此操作

一些好的读物: http://adamprescott.net/2012/08/28/unit-testing-and-private-methods/http://adamprescott.net/2012/08/21/a-shim-ple-tutorial-with-microsoft-fakes/

该示例有一个公共方法Read,内部调用SecretMethod私有...

var target = new FileReader("foo");
var shim = new ShimFileReader(target);
bool calledShimMethod = false;
shim.SecretMethod = () => 
{
   calledShimMethod = true;
   return "bar";
};

target.Read();

答案 1 :(得分:1)

正如另一个回答所提到的,垫片是这样做的方法。但是,请注意,通过使用填充程序,您的测试现在与公共方法的实现相关联。在许多情况下,您无法做任何事情,特别是如果您正在测试未编写的代码。请记住,测试实现意味着在代码更改时,您的测试更容易破解。

话虽如此,你确实设法逃避了导致大量设置的实现细节,这是一个优势,所以你可能会走向 less 脆弱的东西。

我在一个正在进行的项目中使用了垫片,但是像我一样,每次需要时都应该感觉很糟糕,因为它是一个很好的设计指标。避免它的最好方法是策略模式(和一般的DI),因为那时你可以依赖存根。