本篇文章讨论了protected方法的测试和Mock,以及其中需要注意的一些可测试性的方面。这是一篇简单的文章,讨论了单元测试中遇到protected成员的应对方案。此外,在文章最后也希望和大家讨论一下某个特殊的情况下的处理方法。
创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站制作、网站建设、磐安网络推广、小程序制作、磐安网络营销、磐安企业策划、磐安品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供磐安建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
protected是一个有趣而有用的修饰符,它把方法的访问成员严格限制在自身或自己的子类身上。换句话说,在使用过程中,protected成员对外部是开放的(因为其他类可以通过继承来使用该成员),又是封闭的(不是自身或子类的一切成员都无法访问)。而对于单元测试来说,protected成员又是尴尬的,因为它的“开放”意味着我们必须对它进行单元测试,而“封闭”又阻碍了我们在单元测试中涉及protected成员。
测试protected方法
现在有一个类,其中包含一个protected方法:
- public class SomeClass
- {
- protected int SomeMethod(string arg) { ... }
- }
如果我们需要对这个protected方法进行单元测试,可以在测试代码中准备一个辅助类型:
- public class SomeClassForTest : SomeClass
- {
- public int PublicSomeMethod(string arg)
- {
- return this.SomeMethod(arg);
- }
- }
于是在单元测试中,便可以通过调用PublicSomeMethod来测试基类的SomeMethod方法:
- var testClass = new SomeClassForTest();
- var result = testClass.PublicSomeMethod(null);
- Assert.Equal(0, result);
非常简单。
如果您觉得麻烦,也可以将SomeClass类中的SomeMethod方法改为protected internal,这样便可以在InternalVisibleTo的测试程序集中使用了。不过,我觉得为单元测试而改变成员的访问级别不是一个合适的做法。
对protected方法进行Mock
现在有一个类,其中有一个protected方法:
- public class SomeClass
- {
- protected virtual int SomeMethod(string arg) { ... }
- }
并且,某个被测试的方法接受SomeClass作为参数。虽然被测试的方法不会直接调用SomeMethod方法,但是SomeMethod的实现会影响到公开接口的表现形式。于是,我们需要对SomeMethod进行Mock或Stub。为此,我们同样需要准备一个辅助类型:
- public class MockSomeClass : SomeClass
- {
- protected override int SomeMethod(string arg)
- {
- return this.PublicSomeMethod(arg);
- }
- public virtual int PublicSomeMethod(string arg)
- {
- return base.SomeMethod(arg);
- }
- }
在MockSomeClass中,我们覆盖了基类的SomeMethod实现,使它调用了子类中公开的PublicSomeMethod方法,而PublicSomeMethod内部又调用了基类的SomeMethod方法。因此,如果您不去进行任何处理,那么MockSomeClass会保持SomeMethod的实现不变。而如果您需要对SomeMethod进行Mock或Stub的时候,便可以从PublicSomeMethod下手:
- Mock
mockSomeClass = new Mock () { CallBase = true }; - mockSomeClass.Setup(c => c.PublicSomeMethod("123")).Returns(123);
- DoSomeTest(mockSomeClass.Object); // use the mock object
也很容易。
为了可测试性
值得注意的是,为了“可测试性”,第二部分中的protected方法必须是virtual的,因为我们需要在子类中进行override。同理,Mock框架能够辅助的方法也必须是virtual的,即使是一个public方法。那么,您觉得这是为了可测试性而做出的让步吗?或者换句话说,您觉得,一个不可以override的protected方法,但是会影响到其他公开接口的功能,这是不是一个合理的设计呢?如果这是一个合理的设计,又不想作出这样的让步……我们又该怎么做呢?
本文来自老赵点滴:《与protected成员有关的单元测试方式》
【编辑推荐】
网页名称:Protected方法与单元测试
URL标题:http://www.shufengxianlan.com/qtweb/news4/235204.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联