2013-01-15 60 views
0

我正在使用MSTest在C#(Visual Studio 2012)中執行一些TDD。 我有一個類聲明[TestClass]屬性。 我的測試類繼承自我試圖測試的類。爲什麼我的C#TestClass類抱怨(錯誤地)它的父類沒有無參數的構造函數?

父類有一個無參數的構造函數,但我得到一個編譯錯誤

'RatingsClass.OutputLine' does not contain a constructor that takes 0 arguments 

這裏是我的基類,其參數的構造函數:

namespace RatingsClasses 
{ 
    public class OutputLine 
    { 
     public OutputLine() 
     { 
      Initialise("Parameterless constructor called"); 
     } 
(and so on) 

下面是測試類從基類繼承。這會導致下面的生成錯誤:

'RatingsClass.OutputLine' does not contain a constructor that takes 0 arguments 

代碼:

using RatingsClasses; 

namespace RatingsKataV2 
{ 
    [TestClass] 
    public class RatingsTests: OutputLine 
    { 
     [TestMethod] 
     public void TestSingleTripRatingIs20() 
     { 
(and so on) 

此外,當我試圖直接從派生類的構造函數調用基類的無參數的構造函數,我得到很多的紅色波浪線和語法錯誤,如Constructor must have bodyUnexpected token

這是我嘗試調用基類的構造明確:

using RatingsClasses; 

namespace RatingsKataV2 
{ 
    [TestClass] 
    public class RatingsTests: OutputLine 
    { 
     public RatingsTests(): OutputLine() 
     { 

     } 
(the rest of the class goes here) 

我在做什麼錯?

我這樣做的原因是我想測試我的基類的各個私人成員正在正確填充。我的測試類只是從它正在測試的類繼承而來,而不是提供getter和setter或者使這些成員公開,所以它可以直接訪問這些私有成員。有沒有更好的方法來做到這一點?

+2

如果你得到「構造函數必須有身體」和「意外的令牌」(在你試圖顯式調用構造函數之前),那麼還有其他的錯誤。請提供一個簡短但完整的*程序,它不會編譯。 –

+0

@JonSkeet:她得到這一行的錯誤:'Public RatingsTests():OutputLine()'顯然是不正確的。 –

+0

您是否將代碼粘貼到問題中或鍵入?我懷疑你的基類有一個打字錯誤,你在輸入你的問題時沒有重複。 – phoog

回答

0

TestClass屬性適用於包含單元測試的類,不適用於那些作爲這些測試目標的類。通過從測試目標中派生出來,您也將該目標擴展到RatingsTests。

RatingsTests應該不需要從OutputLine繼承以便測試,但構造函數應該讀取。

public RatingsTests(): base() {} 
+0

測試類從正在測試的類繼承的原因是,它可以訪問該類的私有成員。有點像自我分流,我想? 無論如何,事實證明,所有這些問題都是由於基礎類中存在問題導致的早期構建錯誤造成的。一旦這些問題得到解決,其他一切工作也就完成 課程:一次修復一個構建錯誤,而不是先行掃描,然後嘗試先修復後面的錯誤! 不過,我想知道繼承是否是測試訪問正在測試的類中的私有成員的好方法? – Geekette

2

您的語法對於調用基構造函數是錯誤的。您應該使用base關鍵字:

public RatingsTest() 
    : base() 
{ 

} 
0

您使用base明確地選擇要使用的基類的構造函數:

public RatingsTests() : base() 
{ 
} 

然而,這是不必要的,因爲參數的構造函數是當省略時使用默認值。

你顯示的第一個代碼應該可以工作,所以我猜你的實際代碼是不同的,或者你的代碼庫中有第二個類名爲OutputLine

請確保您使用的是正確的OutputLine類,並且此類實際上具有public無參數構造函數。如果缺少public,它將自動爲private,並且不能由派生類使用。

相關問題