本篇文章讨论了protected方法的测试和Mock,以及其中需要注意的一些可测试性的方面。这是一篇简单的文章,讨论了单元测试中遇到protected成员的应对方案。此外,在文章最后也希望和大家讨论一下某个特殊的情况下的处理方法。
protected是一个有趣而有用的修饰符,它把方法的访问成员严格限制在自身或自己的子类身上。换句话说,在使用过程中,protected成员对外部是开放的(因为其他类可以通过继承来使用该成员),又是封闭的(不是自身或子类的一切成员都无法访问)。而对于单元测试来说,protected 成员又是尴尬的,因为它的“开放”意味着我们必须对它进行单元测试,而“封闭”又阻碍了我们在单元测试中涉及protected成员。
测试protected方法
现在有一个类,其中包含一个protected方法:
1. public class SomeClass 2. { 3. protected int SomeMethod(string arg) { ... } 4. } |
如果我们需要对这个protected方法进行单元测试,可以在测试代码中准备一个辅助类型:
1. public class SomeClassForTest : SomeClass 2. { 3. public int PublicSomeMethod(string arg) 4. { 5. return this.SomeMethod(arg); 6. } 7. } |
1. var testClass = new SomeClassForTest(); 2. var result = testClass.PublicSomeMethod(null); 3. Assert.Equal(0, result); |
非常简单。
如果您觉得麻烦,也可以将SomeClass类中的SomeMethod方法改为protected internal,这样便可以在InternalVisibleTo的测试程序集中使用了。不过,我觉得为单元测试而改变成员的访问级别不是一个合适的做法。