C# 如何模拟CellSet对象

C# 如何模拟CellSet对象,c#,unit-testing,adomd.net,C#,Unit Testing,Adomd.net,我得到了一个转换为DataTable的方法。大概是这样的: public DataTable ConvertCellSetToDataTable(CellSet cellSet) { if (cellSet == null) { return null; } var dataTable = new DataTable(); SetColumns(cellSet, dataTable); WriteValues(cellSet, d

我得到了一个转换为DataTable的方法。大概是这样的:

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

    var dataTable = new DataTable();
    SetColumns(cellSet, dataTable);
    WriteValues(cellSet, dataTable);
    return dataTable;
}
现在我想为这个方法编写单元测试。通常我会使用new来创建实例,但这次我没有看到这个类的任何公共构造函数方法

那么,我还能做什么呢

  • 模拟单元集对象
  • 并修改其属性,例如轴

  • 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
    }
    

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

    显示您要进行单元测试的方法。@Yogi Updated。我没有将方法SetColumns或WriteValues放在这里,因为我认为它对于这个问题来说太详细了。基本上,他们从这个单元集中读取数据,构建数据列,并为数据行赋值……你能展示
    SetColumns
    WriteValues
    方法吗。需要查看他们使用的
    CellSet
    的哪些属性/方法。然后我可以向您展示要抽象的内容,这样您就不会直接耦合到
    CellSet
    类。
    Microsoft.AnalysisServices.AdomdClient
    命名空间中的大多数类都是密封的,不提供公共构造函数,这使得它们很难模拟/伪造。