2012-07-27 59 views
0

我有以下代碼:單位通過測試參數的基礎構造

 using System; 
     using NUnit.Framework; 
     using Rhino.Mocks; 

     public class A 
     { 
     } 

     public class B 
     { 
     } 

     public interface IStatementExecutor 
     { 
      void Exec(string statement); 
     } 

     public abstract class Foo<T> 
     { 
      private readonly IStatementExecutor _statementExecutor; 
      private readonly string _targetSegment; 

      protected Foo(IStatementExecutor statementExecutor, string targetSegment) 
      { 
       _statementExecutor = statementExecutor; 
       _targetSegment = targetSegment; 
      } 

      public void Update(T item) 
      { 
       _statementExecutor.Exec("sp_" + _targetSegment + "Update"); 
      } 
     } 

     public class Bar : Foo<A> 
     { 
      public Bar(IStatementExecutor statementExecutor) 
       : base(statementExecutor, "ATable") 
      { 
      } 
     } 

     public class Baz : Foo<B> 
     { 
      public Baz(IStatementExecutor statementExecutor) 
       : base(statementExecutor, "BTable") 
      { 
      } 
     } 

     [TestFixture] 
     public class Foo_Tests 
     { 
      [Test] 
      public void Update_CallsStatementExecutorWithTableName() 
      { 
       const string tableName = "TestTable"; 
       var mockStatementExecutor = MockRepository.GenerateMock<IStatementExecutor>(); 
       mockStatementExecutor.Expect(m => m.Exec("sp_" + tableName + "Update")); 
       var sut = MockRepository.GeneratePartialMock<Foo<A>>(mockStatementExecutor, tableName); 
       var testModel = new A(); 


       sut.Update(testModel); 

       mockStatementExecutor.AssertWasCalled(m => m.Exec("sp_" + tableName + "Update")); 
      } 
     } 

我已經爲基類Foo<T>單元測試。由於基類已經被覆蓋,所以我不想爲派生類BarBaz編寫相同的測試。

我真正關心的派生類中唯一的事情就是將正確的字符串target傳遞給基類。

我正在努力如何在不破壞派生類的封裝或編寫冗餘單元測試的情況下進行單元測試。

所以,問題是,我該如何測試從target參數的派生類中傳遞給基類的正確值?

(如果你的回答是「用組成...」,請從上面修改的代碼示例備份。

謝謝!

+0

在您的實際情況中,「ATable」是硬編碼嗎?它是一個常量? – 2012-07-27 15:44:03

+0

你可否請你發佈你的基類'Foo'的單元測試?我發現它是一個'abstract'類(不能創建對象),'_target'是一個私有變量(在測試中不可訪問),好奇地想知道你是如何進行單元測試的。 – Channs 2012-07-27 15:47:00

+1

進一步到@channs評論 - Foo的方法正在呼叫到控制檯,那麼你如何測試這些? – 2012-07-27 15:47:42

回答

1

想想I'be更有可能通過在酒吧和巴茲其他方法來測試,如你所期望壞事發生,如果你會把ZTable在那裏,而不是BTABLE

你可以添加一個方法到Foo將返回曾經傳遞給它的所有內容

然後在創建後代後調用它並根據期望值進行驗證。

或者你可以做這樣的事情

public class Bar : Foo<A>  
{   
    private static String _tableName = "ATable"; 
    public String TableName {get {return _tableName;}} 
    public Bar() : base(_tableName)   
    {   
    }  
} 

然後,你可以測試testBar.TableName

另一種選擇是T爲一個結構或具有TableName屬性類,那麼你就不需要酒吧和巴斯後裔,只是爲了這一點。

0

你的Foo和Bar單元測試方法可以調用輔助方法包含常見的測試代碼。

0

您可以在許多方面做到這一點。你可以使用像TypeMock嘲弄的框架,以有效地嘲笑基於類,因而從TypeMock獲取有關內部變量更多信息的一種方式。

但是,從你的帖子中看不出來,爲什麼爲什麼酒吧類使用基類是很重要的。這是不明確的,因爲你沒有辦法測試它。即沒有可以監控的外部行爲,以保證Bar以預期的方式使用Foo。你可能重定向控制檯輸出,然後監視該輸出進行驗證。但是,我不認爲這真的是你想要的。

你應該提供一個更可測試的例子;不只是輸出文字的東西,這些東西具有可以通過測試觀察到的真實行爲。