如何模拟 CellSet 对象
How to mock a CellSet object
我得到了一种将 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 来创建一个实例,但是这次我没有看到这个 class.
的任何 public 构造函数方法
那么,有没有什么办法可以
- 模拟 CellSet 对象
- 并修改它的属性,例如 Axes?
Rhino.Mocks是我选择的单元测试框架。
你不应该嘲笑 classes/objects 你不拥有。在这种情况下,因为您将方法耦合到 CellSet
,所以您现在直接依赖于它。
Microsoft.AnalysisServices.AdomdClient
命名空间中的大多数 classes 是密封的并且不提供 public 构造函数,这使得它们很难 mock/fake。
查看 CellSet
class 并确定您希望从中获得哪些功能。提取您需要的 properties/methods 并决定要在您可以控制的服务背后抽象什么。
这是我刚才解释的一个简化示例。
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
}
然后您可以模拟所需的功能,以便使用您选择的测试框架测试您的方法。
我得到了一种将 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 来创建一个实例,但是这次我没有看到这个 class.
的任何 public 构造函数方法那么,有没有什么办法可以
- 模拟 CellSet 对象
- 并修改它的属性,例如 Axes?
Rhino.Mocks是我选择的单元测试框架。
你不应该嘲笑 classes/objects 你不拥有。在这种情况下,因为您将方法耦合到 CellSet
,所以您现在直接依赖于它。
Microsoft.AnalysisServices.AdomdClient
命名空间中的大多数 classes 是密封的并且不提供 public 构造函数,这使得它们很难 mock/fake。
查看 CellSet
class 并确定您希望从中获得哪些功能。提取您需要的 properties/methods 并决定要在您可以控制的服务背后抽象什么。
这是我刚才解释的一个简化示例。
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
}
然后您可以模拟所需的功能,以便使用您选择的测试框架测试您的方法。