在使用 Fakes 时测试的方法中“模拟”对私有方法的调用
本文关键字:模拟 调用 有方法 方法 Fakes 测试 | 更新日期: 2023-09-27 18:33:25
我正在使用Microsoft Fakes来分析一个很长的方法,重构它并更好地理解它。 我已经隔离了几行,这些行看起来是一个很好的候选者,可以重构到一个单独的私有方法中。 我采取的方法是不要手动修改代码(仅使用开箱即用的重构),以最大程度地减少更改的影响。 问题是:一旦我将有问题的行重构为一个单独的私有方法,我想消除与这些行相关的所有设置代码(以及包装它们的新私有方法),并通过提供默认的预设答案来"模拟"该调用。 这闻起来像存根/垫片,但我们谈论的是被测试的类,所以我需要该类来执行其代码,除了"模拟"方法。 在 Rhino Mocks 中,我会使用 PartialMock 来存根此类调用(在将它们设为虚拟后!!),但 Fakes 在这种情况下能帮助我吗?谢谢。
如果你想覆盖私有方法(模拟私有方法),你可以使用填充程序来做到这一点
一些好的阅读: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();
正如另一个答案所提到的,填充程序是做到这一点的方法。但是,请注意,通过使用填充程序,测试现在与公共方法的实现相关联。在许多情况下,你对此无能为力,特别是如果你正在测试你没有编写的代码。请记住,测试实现意味着当代码更改时,您的测试将更容易中断。
话虽如此,您确实设法逃避了导致大量设置的实现细节,这是一个加号,因此您可能会朝着不那么脆弱的方向前进。
我在我正在处理的项目上经常使用垫片,但像我一样,你可能每次需要的时候都应该感觉不好,因为它是糟糕设计的一个相当好的指标。避免它的最佳方法是策略模式(以及一般的 DI),因为那时您可以依赖存根。