我正在使用 Microsoft Fakes 来分析一个很长的方法,对其进行重构并更好地理解它。我已经分离出几行看起来像是一个很好的候选者,可以重新分解为一个单独的私有方法。我采用的方法不是手动修改代码(仅使用开箱即用的重构),以尽量减少我的更改带来的影响。这是问题:一旦我将有问题的行重新分解为单独的私有方法,我想消除与这些行相关的所有设置代码(以及包装它们的新私有方法),然后“模拟”通过提供默认的预设答案来拨打电话。这闻起来像存根/垫片,但我们正在谈论被测类,所以我需要该类来执行它的代码,除了“模拟”方法。在 Rhino Mocks 中,我会使用 PartialMock 来消除这样的调用(在首先使它们成为虚拟之后!!!)但是在这种情况下 Fakes 可以帮助我吗?谢谢。
问问题
4312 次
2 回答
5
如果你想覆盖私有方法(模拟私有方法),你可以使用 shims
一些不错的读物: 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();
于 2013-09-30T20:03:25.387 回答
1
正如另一个答案所提到的,垫片是做到这一点的方法。但是,请注意,通过使用 shim,您的测试现在与公共方法的实现相关联。在许多情况下,您对此无能为力,尤其是在您测试不是您编写的代码时。请记住,测试实现意味着您的测试在代码更改时更容易中断。
话虽如此,您确实设法避免了导致大量设置的实现细节,这是一个优点,因此您可能会朝着不那么脆弱的方向前进。
我在我正在处理的项目中使用了很多 shims,但像我一样,你可能每次需要时都会感到很糟糕,因为它是糟糕设计的一个很好的指标。避免它的最好方法是策略模式(以及一般的 DI),因为那时你可以依赖存根。
于 2013-10-08T15:21:16.573 回答