2016-04-20 86 views
2

我有一種將CellSet轉換爲DataTable的方法。類似這樣的:如何模擬一個CellSet對象

public DataTable ConvertCellSetToDataTable(CellSet cellSet) 
{ 
    if (cellSet == null) 
    { 
     return null; 
    } 

    var dataTable = new DataTable(); 
    SetColumns(cellSet, dataTable); 
    WriteValues(cellSet, dataTable); 
    return dataTable; 
} 

現在我想寫這個方法的單元測試。通常我會用new來創建一個實例,但是這次我沒有看到這個類的公共構造方法。

那麼,有沒有反正我可以

  1. 模擬單元集對象
  2. 並修改它的屬性,如軸?

Rhino.Mocks是我的單元測試框架的選擇。

+0

顯示你想要單元測試的方法。 – Yogi

+0

@Yogi更新。我沒有把方法SetColumns或WriteValues放在這裏,因爲我認爲這個問題太詳細了。基本上他們從這個CellSet中讀取數據並構建數據列併爲數據行分配值... – lastr2d2

+0

您可以顯示'SetColumns'和'WriteValues'方法。需要查看它們使用的「CellSet」的屬性/方法。然後,我可以向您展示要抽象的內容,以便您不直接耦合到「CellSet」類。 「Microsoft.AnalysisServices.AdomdClient」命名空間中的大多數類都是密封的,並且不提供公共構造函數,這使得它們很難模擬/僞造。 – Nkosi

回答

1

你不應該模擬你不擁有的類/對象。在這種情況下,因爲您將方法耦合到CellSet,您現在直接依賴該方法。

Microsoft.AnalysisServices.AdomdClient命名空間中的大多數類都是密封的,並且沒有提供公共構造函數,這使得它們很難模擬/僞造。

查看CellSet類,並確定您想要的功能。提取你需要的屬性/方法,並決定你想要在你可以控制的服務背後提取什麼。

這裏是我剛剛解釋的一個簡單例子。

public class MyClassUnderTest { 
    public DataTable ConvertCellSetToDataTable(ICellSetWrapper cellSet) { 
     if (cellSet == null) { 
      return null; 
     } 

     var dataTable = new DataTable(); 
     SetColumns(cellSet, dataTable); 
     WriteValues(cellSet, dataTable); 
     return dataTable; 
    } 

    private void WriteValues(ICellSetWrapper cellSet, DataTable dataTable) { 
     //...assign value to datarows 
    } 

    private void SetColumns(ICellSetWrapper cellSet, DataTable dataTable) { 
     //...read data from this CellSet and build data columns 
    } 
} 

public interface ICellSetWrapper { 
    //...Methods and propeties exposing what you want to use 
} 

public class MyCellSetWrapper : ICellSetWrapper { 
    CellSet cellSet; 
    public MyCellSetWrapper(CellSet cellSet) { 
     this.cellSet = cellSet; 
    } 
    //...Implemented methods/properties 
} 

然後,您可以模擬所需的功能,以便用您選擇的測試框架測試您的方法。

+1

看起來像是這樣做的唯一方法..謝謝.. – lastr2d2