2010-07-01 33 views
2

我想創建一個測試類,它使用內部類組織它的測試方法。我想這個類是抽象的,可以設置一個靜態屬性,這樣可以注入這個屬性。下面是我在談論的一個例子:如何使用抽象基類繼承內部類?

[TestClass] 
public abstract class BaseUnitTest 
{ 
    public static string InjectedProperty; 

    public static string GetInjectedString() 
    { 
     return InjectedProperty; 
    } 

    [TestClass] 
    public class WhenFoo 
    { 
     [TestMethod] 
     public void TestFoo() 
     { 
     string str = GetInjectedString(); 
     } 
    } 
} 

[TestClass] 
public class DeriverdUnitTest : BaseUnitTest 
{ 
    [ClassInitialize] 
    public void SetUp() 
    { 
     InjectedProperty = "Injected Property"; 
    } 
} 

不過,我沒有看到一個DerivedUnitTest + WhenFoo +命名爲testFoo()類在我的單元測試視圖中。我正在使用Visual Studio 2010.我猜測,當我重寫BaseUnitTest時,我也沒有重寫它的內部類。我想我可以讓它的內部類抽象並在稍後重寫它們,但是隨着我的測試類的複雜性增加,這將變得非常煩人。有人可以解釋爲什麼會發生這種情況,以及我如何解決這個問題?

謝謝。

編輯:

我覺得我需要更好地解釋我的原因,想做到這一點。我們想要實現一個非常詳細的測試標準。因此測試類會是這個樣子:

[TestClass] 
public abstract class BaseUnitTest 
{ 
    public static string InjectedProperty; 

    public static string GetInjectedString() 
    { 
     return InjectedProperty; 
    } 

    [TestClass] 
    public class WhenFooIsCalled 
    { 
     [TestClass] 
     public class AndTheArgumentIsNull 
     { 
     [TestMethod] 
     public void AnArgumentNullExceptionShouldBeThrown() 
     { 
      string str = GetInjectedString(); 
     } 
     } 
    } 
} 

這樣做的好處是,當你打開Visual Studio中的測試視圖,並顯示方法的名稱和類的名稱列,你得到的東西看起來是這樣的:

BaseUnitTest+WhenFooIsCalled+AndTheArgumentIsNull AnArgumentNullExceptionShouldBeThrown() 

這使得瀏覽幾百個通過測試中應該做的失敗測試變得容易很多。

我希望能夠覆蓋抽象BaseUnitTest的主要原因是因爲當我將所有包含在BaseUnitTest中的測試都添加到DerivedUnitTest並顯示在Visual Studio的測試視圖中時。

再次感謝。

+0

我不知道如何做到這一點在VS 2010中,但它可能有助於知道,NUnit的+ ReSharper的做到這一點沒有任何問題: http://code.google.com/p/wipflash/source/browse/Examples/ExampleUtils/AutomationElementWrapperExamples.cs – Lunivore 2010-07-01 21:00:08

+0

這看起來很有希望。你可以進一步瞭解我將如何使用它來解決我的問題嗎? 謝謝。 – LandonSchropp 2010-07-04 01:59:56

回答

2

嵌套類型不這樣工作。你不能「覆蓋」類型。

目前還不清楚你想在這裏做什麼,但我認爲它不會奏效。

+0

我想我會等5分鐘才能得到真正的答案。 – 2010-07-01 21:02:30

+0

@Hans:我沒有編輯這個......我真的不知道這裏要做什麼,所以我不能提出任何建議,只能回到繪圖板。也許我只是累了。如果你有一個想法,去吧:) – 2010-07-01 21:12:32

+0

Okey-dokey,我會給它一個鏡頭然後。 – 2010-07-01 21:44:05

0

如何使用配置文件?對於實施例

[TestClass] 
    public class WhenFoo 
    { 
     [TestMethod] 
     public void TestFoo() 
     { 
     string str = ConfigurationManager.AppSettings["WhenFooTestFooString"]; 
     } 
    } 
+0

我注入的字符串只是一個例子。在真實情況下,我會注入一些其他對象,如對象註冊表。 – LandonSchropp 2010-07-04 01:55:54

3

在C#語言,嵌套類具有與其中它們嵌套類沒有特殊的關係。它是一個完全不同的類型。只有一個很好的理由你會這樣做:你可以聲明這個類是私人的。這可以幫助您創建一個小型工人班,代表外部班級完成工作,這是一個外部完全不可見的班級。非常有用,你不能以其他方式在外部範圍聲明一個私人類,你可以做的最好的是內部的。

接下來的內容是它決不會在外部類的繼承中發揮作用。您從外部派生的類根本無法查看基類內部的嵌套類。這意圖是什麼,宣稱它是私密的,是把它放在首位的原因。

Punt:如果你需要派生類中的那個類,只需聲明它爲internal或public。

+0

感謝您的回覆。我編輯我的帖子有一個更好的理由想要這種行爲。對於內部類在C#中的工作方式,這是不幸的。你能想出一種模仿我想要做的事情的方法嗎? – LandonSchropp 2010-07-04 01:54:55