我有一个将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来创建实例,但是这次我没有看到此类的任何公共构造方法。

所以,无论如何我能


模拟一个CellSet对象
并修改它的属性,例如轴?


Rhino.Mocks是单元测试框架的最佳选择。

最佳答案

您不应该嘲笑您不拥有的类/对象。在这种情况下,由于您将方法与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
}


然后,您可以模拟所需的功能,以便使用您选择的测试框架来测试您的方法。

10-08 18:33