3

关于我之前提出的这个问题,我再次陷入了单元测试的困境。

我目前的问题与测试protected我的抽象Component类的方法有关。

我已经成功实现了一个名为 的模拟类,ConcreteComponent它很好地继承了抽象类的所有内容。

问题是,我在我的单元测试文件中创建了这个具体的类。测试受保护方法的唯一方法是拥有一个私有访问器。但是,我无法在与单元测试所在的文件相同的文件中创建私有访问器,因此无法访问受保护的方法。

我试图将模拟具体类放在一个单独的文件中,在不同的命名空间下,现在这允许我创建一个私有访问器,单元测试文件现在可以使用它。它工作得很好,但后来我想我需要在单元测试所在的同一个文件中使用这个模拟具体类。

所以现在我有两个问题:

1)这个问题的可能解决方法是什么?

2) 为什么我不能为与单元测试类位于同一文件和命名空间内的模拟类创建私有访问器?

4

2 回答 2

2

您可以查看PrivateObject类,以便在测试中访问您的类的非公共 API。它在内部使用反射。类的受保护资产仍然是外部客户端的 api,在这种情况下,外部客户端是子类或派生类。所以想要测试这样的 api 是可以理解的。我不建议仅仅为了测试受保护的 api 而污染一个类来公开公共 api。但是,由于在您的情况下,派生类在测试项目中,您实际上可以提供公共 api 以使测试更容易并提高性能(反射会更慢,如果您正在运行测试,则在进行代码更改时持续测试,它可能会使测试运行速度变慢,具体取决于测试的数量等)。

于 2013-03-04T12:05:30.673 回答
0

受保护的功能之所以存在,是因为您不想将其暴露给您的客户。但是如果它受到保护,那么可以通过一些令人满意的条件通过公共接口访问,如果不是,那么它是一个死代码,所以删除它。

所以黄金法则是

1-不要试图通过使用技术(反射等)来规避测试私有/受保护的方法,尝试通过公共接口对私有/受保护的方法进行单元测试,顺便说一句,为什么您使用 VS 2008 测试以及为什么不使用 NUnit

于 2013-03-04T11:51:44.843 回答