日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Protected方法與單元測(cè)試

本篇文章討論了protected方法的測(cè)試和Mock,以及其中需要注意的一些可測(cè)試性的方面。這是一篇簡(jiǎn)單的文章,討論了單元測(cè)試中遇到protected成員的應(yīng)對(duì)方案。此外,在文章最后也希望和大家討論一下某個(gè)特殊的情況下的處理方法。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、網(wǎng)站建設(shè)、磐安網(wǎng)絡(luò)推廣、小程序制作、磐安網(wǎng)絡(luò)營(yíng)銷、磐安企業(yè)策劃、磐安品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供磐安建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com

protected是一個(gè)有趣而有用的修飾符,它把方法的訪問(wèn)成員嚴(yán)格限制在自身或自己的子類身上。換句話說(shuō),在使用過(guò)程中,protected成員對(duì)外部是開(kāi)放的(因?yàn)槠渌惪梢酝ㄟ^(guò)繼承來(lái)使用該成員),又是封閉的(不是自身或子類的一切成員都無(wú)法訪問(wèn))。而對(duì)于單元測(cè)試來(lái)說(shuō),protected成員又是尷尬的,因?yàn)樗摹伴_(kāi)放”意味著我們必須對(duì)它進(jìn)行單元測(cè)試,而“封閉”又阻礙了我們?cè)趩卧獪y(cè)試中涉及protected成員。

測(cè)試protected方法

現(xiàn)在有一個(gè)類,其中包含一個(gè)protected方法:

 
 
 
  1. public class SomeClass  
  2. {  
  3.     protected int SomeMethod(string arg) { ... }  

如果我們需要對(duì)這個(gè)protected方法進(jìn)行單元測(cè)試,可以在測(cè)試代碼中準(zhǔn)備一個(gè)輔助類型:

 
 
 
  1. public class SomeClassForTest : SomeClass  
  2. {  
  3.     public int PublicSomeMethod(string arg)  
  4.     {  
  5.         return this.SomeMethod(arg);  
  6.     }  

于是在單元測(cè)試中,便可以通過(guò)調(diào)用PublicSomeMethod來(lái)測(cè)試基類的SomeMethod方法:

 
 
 
  1. var testClass = new SomeClassForTest();  
  2. var result = testClass.PublicSomeMethod(null);  
  3. Assert.Equal(0, result); 

非常簡(jiǎn)單。

如果您覺(jué)得麻煩,也可以將SomeClass類中的SomeMethod方法改為protected internal,這樣便可以在InternalVisibleTo的測(cè)試程序集中使用了。不過(guò),我覺(jué)得為單元測(cè)試而改變成員的訪問(wèn)級(jí)別不是一個(gè)合適的做法。

對(duì)protected方法進(jìn)行Mock

現(xiàn)在有一個(gè)類,其中有一個(gè)protected方法:

 
 
 
  1. public class SomeClass  
  2. {  
  3.     protected virtual int SomeMethod(string arg) { ... }  

并且,某個(gè)被測(cè)試的方法接受SomeClass作為參數(shù)。雖然被測(cè)試的方法不會(huì)直接調(diào)用SomeMethod方法,但是SomeMethod的實(shí)現(xiàn)會(huì)影響到公開(kāi)接口的表現(xiàn)形式。于是,我們需要對(duì)SomeMethod進(jìn)行Mock或Stub。為此,我們同樣需要準(zhǔn)備一個(gè)輔助類型:

 
 
 
  1. public class MockSomeClass : SomeClass  
  2. {  
  3.     protected override int SomeMethod(string arg)  
  4.     {  
  5.         return this.PublicSomeMethod(arg);  
  6.     }  
  7.  
  8.     public virtual int PublicSomeMethod(string arg)  
  9.     {  
  10.         return base.SomeMethod(arg);  
  11.     }  
  12. }  

在MockSomeClass中,我們覆蓋了基類的SomeMethod實(shí)現(xiàn),使它調(diào)用了子類中公開(kāi)的PublicSomeMethod方法,而PublicSomeMethod內(nèi)部又調(diào)用了基類的SomeMethod方法。因此,如果您不去進(jìn)行任何處理,那么MockSomeClass會(huì)保持SomeMethod的實(shí)現(xiàn)不變。而如果您需要對(duì)SomeMethod進(jìn)行Mock或Stub的時(shí)候,便可以從PublicSomeMethod下手:

 
 
 
  1. Mock mockSomeClass = new Mock() { CallBase = true };  
  2. mockSomeClass.Setup(c => c.PublicSomeMethod("123")).Returns(123);  
  3.  
  4. DoSomeTest(mockSomeClass.Object); // use the mock object  

也很容易。

為了可測(cè)試性

值得注意的是,為了“可測(cè)試性”,第二部分中的protected方法必須是virtual的,因?yàn)槲覀冃枰谧宇愔羞M(jìn)行override。同理,Mock框架能夠輔助的方法也必須是virtual的,即使是一個(gè)public方法。那么,您覺(jué)得這是為了可測(cè)試性而做出的讓步嗎?或者換句話說(shuō),您覺(jué)得,一個(gè)不可以override的protected方法,但是會(huì)影響到其他公開(kāi)接口的功能,這是不是一個(gè)合理的設(shè)計(jì)呢?如果這是一個(gè)合理的設(shè)計(jì),又不想作出這樣的讓步……我們又該怎么做呢?

本文來(lái)自老趙點(diǎn)滴:《與protected成員有關(guān)的單元測(cè)試方式》

【編輯推薦】

  1. 開(kāi)發(fā)人員最欠缺哪些測(cè)試知識(shí)?
  2. 編程對(duì)軟件測(cè)試人員意味著什么?
  3. 使用JBPM工作流引擎測(cè)試的一個(gè)例子
  4. 軟件測(cè)試項(xiàng)目的啟動(dòng)、規(guī)劃與需求分析
  5. 偉大騾子的一生和性能測(cè)試

分享文章:Protected方法與單元測(cè)試
URL網(wǎng)址:http://www.dlmjj.cn/article/cojojdj.html