2013-03-04 97 views
3

关于this question我刚才问,我再一次被我的单元测试困住了。我应该访问单元测试的受保护方法吗?

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

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

事情是,我做我的单元测试文件,这里面具体的类。测试受保护方法的唯一方法是拥有一个专用访问器。但是,我不能在单元测试所在的同一文件中创建一个专用访问器,因此无法访问受保护的方法。

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

所以现在我有两个问题:

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

2)为什么我不能为模拟类创建一个私有访问器,它与单元测试类在同一个文件和名称空间内?

+0

“为什么你不能”是一个很好的问题。你为什么不能?究竟发生了什么或阻止了你? – JRoughan 2013-03-04 11:46:31

+0

以及VS2008不会允许我,无论出于何种原因。当类与单元测试位于同一个文件中时,当我右键单击模拟类的名称时,没有选项可以创建一个专用访问器。但是当我把模拟类放在一个单独的文件中时,就会出现创建一个专用访问器的选项。 – Anthony 2013-03-04 11:48:54

+0

啊,所以它的IDE不让你。没有意识到你正在使用MSTEST和自动生成访问器。在这种情况下,我会遵循下面的Saurabh的建议,并相信/确保公共接口正在执行受保护的代码,或者如果不是,那么为什么它会损坏? – JRoughan 2013-03-04 11:56:46

回答

0

受保护的功能,因为你不希望它暴露给客户端。但是,如果它被保护,那么可以通过公共接口通过一些令人满意的条件来访问,如果它不是那么它是一个死代码,所以删除它。

所以金科玉律是

1,不要试图绕过通过使用技术(反射等)测试私有/保护的方法,尝试单元测试私有/通过公共接口保护,顺便说一句,为什么你正在使用VS 2008测试,为什么不用NUnit代替

+1

我想补充一点,重构那个功能到其他类,所以它可以被单元自己测试 – 2013-03-04 11:54:17

+0

借用;私人方法应该通过公共接口间接地进行测试,或者它们很复杂,以至于应该将它们提取到一个新的类中。 – 2013-03-04 12:08:21

+0

对于受保护的方法,您的“客户端”可能是一个类,而不是来自基础calss,因此可以访问其受保护的方法。受保护的方法是对象的可使用接口的一部分。完全同意你的观点,尽管你是在谈论私人方法而不是保护方法。 – 2013-03-04 12:10:06

2

你可以看看PrivateObject这个类,在你的测试中获得你的类的非公共API。它在内部使用反射。受保护的类的资产仍然是外部客户的API,在这种情况下,它是一个子类或派生类。所以想要测试这样的api是可以理解的。我不会建议为了测试受保护的api而污染某个类来公开api。然而,因为在你的情况下,派生类是在一个测试项目中,你实际上可以提供公共API来简化测试并提高性能(反射速度会更慢,如果你正在运行测试,持续测试,它可能会使测试运行速度慢,这取决于测试的次数等)。

+0

+1以引用PrivateObject类。虽然评分最高的答案是好的,但我很惊讶,这还没有上传! – Arj 2016-01-12 14:01:39

+0

你先生,改变了我的人生! – 2016-11-18 07:47:42

相关问题