Как издеваться над объектом CellSet

У меня есть метод, который преобразует CellSet в DataTable . Что-то вроде этого:

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 — мой выбор для фреймворка модульного тестирования.


person lastr2d2    schedule 20.04.2016    source источник
comment
Покажите свой метод, который вы хотите протестировать.   -  person Yogi    schedule 20.04.2016
comment
@Йоги Обновлено. Я не поместил здесь метод SetColumns или WriteValues, потому что считаю его слишком подробным для этого вопроса. В основном они читают данные из этого CellSet и строят столбцы данных и присваивают значение строкам данных...   -  person lastr2d2    schedule 20.04.2016
comment
Можете ли вы показать методы SetColumns и WriteValues. Нужно посмотреть, какие свойства/методы CellSet они используют. Затем я могу показать вам, что нужно абстрагировать, чтобы вы не были напрямую связаны с классом CellSet. Большинство классов в пространстве имен Microsoft.AnalysisServices.AdomdClient запечатаны и не предоставляют общедоступных конструкторов, что делает их очень сложными для имитации/подделки.   -  person Nkosi    schedule 20.04.2016


Ответы (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
}

Затем вы можете смоделировать необходимую функциональность, чтобы протестировать свой метод с помощью выбранной вами среды тестирования.

person Nkosi    schedule 20.04.2016