【发布时间】:2012-12-24 21:07:17
【问题描述】:
我遇到了以下问题。假设有一个类,其中包含一个必须测试的私有类。要切断不必要的 cmets 和答案,是它必须保持私密,是,它必须经过测试。
说,它看起来像这样:
public class PublicClass
{
private class InternalClass
{
void Method() { }
}
}
为了方便测试,我想创建以下类:
public class InternalClassAccess
{
private object instance;
public InternalClassAccess()
{
// Use reflections to instantiate InternalClass
// and store it in instance field
}
public void Method()
{
// Use reflections to call Method() on
// stored instance
}
}
我可以手动编写这样的类,但我想知道,是否有某种自动方式这样做?我有专业版的 VS 2012。
【问题讨论】:
-
"是的,它必须保持私密" -- 如果它必须保持私密,但也必须在
PublicClass之外访问,那么您的设计有问题。你没有解释为什么它必须是private,我无法想象为什么它会是一个问题internal。 -
加上如果是
internal,你可以加[InternalsVisibleTo(...)]并指定你的测试项目;那么你的测试项目就可以访问了。 -
它应该不在
PublicClass之外就项目而言是可访问的。另一方面,我想测试它,所以我必须访问这个类(或其他私人成员)。想象一个巨大的类,它有一个方法 DoSomethingComplicatedAndExtremelySpecific 和 100 个小的私有方法,它们做的事情甚至更具体(所以它们不应该可见,也不应该被提取),但是什么会影响最终结果(所以应该对它们进行测试)。我明确写了 not 以切断有关方法隐私和测试需要的 cmets。请接受这些事实。 -
@Spook:这听起来像是无论如何都可以重构的东西。哎呀,听起来它可能是一个完全独立的程序集,只有一个公共类和大量内部类 - 然后您可以使用
InternalsVisibleTo进行测试。 -
想象一下 JPeg 类,它允许您将原始字节 [] 压缩并保存为 Jpeg 文件。该类属于具有类似类的更大程序集:Png、Tiff 等。该类导出两个公共方法:Save 和 Load,但包含一些私有方法,它们实际上可以完成工作。它们不应该是内部的,因为尽管这个类没有人使用它们。你会测试这些吗?
标签: c# unit-testing class private