【发布时间】:2011-12-23 09:12:50
【问题描述】:
public class Foo
{
public string Test()
{
return GetName();
}
public string GetName()
{
return "Foo";
}
}
public class Bar : Foo
{
public new string GetName()
{
return "Bar";
}
}
new Foo().Test(); // Foo
new Bar().Test(); // also Foo
我试图为Foo 创建一个“包装器”,以便在GetName() 产生意外值时对Test() 的行为进行单元测试。我不能直接影响Foo 中GetName() 的行为,因为它依赖于ASP.NET 管道事件。
我希望
new Bar().Test();
会返回“Bar”,但显然我误解了继承模型。
有什么方法可以满足我的需要吗?
【问题讨论】:
-
你可以访问
Foo吗?您可以将Foo.GetName() 设为虚拟并在Bar中覆盖它吗? -
@Steve 是的,我可以这样做,但是当我尝试时行为似乎相同。显然最好不要仅仅为了让测试正常工作而更改
Foo。 -
@ShellShock 现在已将此作为答案 - 它应该按照您的意愿行事。改变它“纯粹是为了让测试工作”是一种看待它的方式,改变它“更容易测试”是一种更积极的倾向:)
-
@fearofawhackplanet 实际上,您应该验证whether it should be hidden or overridden - 无论如何可能是后者(不考虑测试)?
-
@SteveWilkes 是的,这确实有效 - 奇怪的是我之前尝试过,并认为结果是一样的,我一定犯了一个错误。您是否认为使用这样的包装类是一种可接受/有效的测试技术?对我来说感觉有点老套,但在这种情况下我想不出任何替代方案。你在其他地方见过这个吗?
标签: c# unit-testing inheritance method-hiding overriding