2016-04-20 8 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. издеваться CellSet объект
  2. и изменять его свойства, такие как топоры?

Rhino.Mocks - мой выбор для модульной тестовой платформы.

+0

Покажите свой метод, который вы хотите выполнить модульный тест. – Yogi

+0

@Yogi Обновлено. Я не использовал метод SetColumns или WriteValues, потому что я думаю, что это слишком подробно для этого вопроса. В основном они считывают данные из этого набора CellSet и строят столбцы данных и присваивают значение datarows ... – 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

Смежные вопросы