我經常設計系統,我在我的系統中有一個類,有一堆受保護的方法。受保護的方法是因爲它們應該可以被專業化訪問,因此,我認爲受保護的方法是我的一般類和任何專門類之間的契約。模式的名稱是什麼?
因此我想測試這些方法的行爲正確,所以我的單元測試將需要訪問受保護的方法,這東西是不可能在C#中,除非使用骯髒的黑客一樣思考。
的解決方案,我一般選擇的是我創造一個公開這些受保護的方法爲公共我的單元測試中一個專門的類。因爲我始終將單元測試保留在單獨的程序集中,所以系統代碼本身無法訪問這些類,並且在我的系統代碼中,受保護的函數仍然受到保護。
// In the system code assembly
namespace MySystem {
public class SomeClass {
protected void DoSomething() {
...
}
}
}
// In the unit test assembly
namespace MySystem.Unittests {
public class SomeClass2 : SomeClass {
public new void DoSomething() {
base.DoSomething();
}
}
}
我的單元測試現在能夠通過實例化專業類來測試父類的保護成員的行爲。
我也用這個甚至進一步能夠嘲笑對象和模擬函數調用受保護的虛擬功能,但這些代碼是有點複雜,所以我就砍了這一點。
我覺得完成這個任務是如此直截了當,我不可能是這樣做的唯一的人的這種方式,所以我認爲必須有一個常見的命名慣例?
我只是使用接口,並在測試時保留私有方法。無論如何,如果您遵循SRP,他們就不應該受到很大的影響。 – 2009-10-20 15:09:55
我會將SomeClass2重命名爲TestableSomeClass。這澄清了爲什麼和什麼。 (並且,是的,我們在這裏使用這種模式很多...) – 2009-10-20 15:14:35
@Arjan - 我的問題的一點是找出SomClass2; – Pete 2009-10-20 15:41:28