【问题标题】:Need to mock a custom class for unit testing purposes需要模拟自定义类以进行单元测试
【发布时间】:2011-04-06 20:17:46
【问题描述】:

这个问题与我发布的 Previous question 有关。

如前所述,我能够将原始代码重构为两个单独的类;我现在正在尝试通过模拟部分(ExcelManager)来测试不依赖于 Office.Interop 对象的部分(ParseDataTable)。

当我运行测试时,我的模拟对象仅部分工作,GetColumnCount 方法被正确模拟并在 ParseDataTable 对象中返回我的局部变量。

但是没有调用 GetData 模拟方法,代码转而进入 ExcelManager 类的 GetData 方法

用于创建模拟的代码:

MockExcel = new Mock<ExcelManager>("testfile.xls",0);
        MockExcel.Setup(x => x.GetColumnCount()).Returns(columnCount);
        MockExcel.Setup(x => x.GetData()).Returns(mockData);
        MockExcel.Setup(x => x.Initialize());

columnCount 和 mockData 都是测试的局部变量,我的测试基于数据。

我正在测试的课程:

public class ParseDataTable
{
    private const string TableSortOrder = "1 asc, 4 asc, 6 asc";

    public DataTable GetRangeValue(ExcelManager excelManager)
    {
        var columnCount = excelManager.GetColumnCount();
        var sheetData = excelManager.GetData();

        var value = new DataTable();

        for (var j = 1; j <= columnCount; j++)
        {
            value.Columns.Add(j.ToString());
        }

        for (var i = 1; i <= sheetData.GetLength(0); i++)
        {
            var row = value.NewRow();
            var emptyCount = 0;
            for (var j = 1; j <= columnCount; j++)
            {
                row[j - 1] = sheetData[i, j] ?? "";
                if ((string)row[j-1] == "")
                {
                    emptyCount++;
                }
            }

            //if row is empty then no more data is expected
            if (emptyCount == value.Columns.Count) break;

            value.Rows.Add(row);
        }

        excelManager.Dispose();
        return sortDataTable(value);
    }

    private DataTable sortDataTable(DataTable table)
    {
        table.DefaultView.Sort = TableSortOrder;
        table = table.DefaultView.ToTable();
        return table;
    }
}

ExcelManager 类中需要模拟的方法:

        public virtual int GetColumnCount()
    {
        var headerRng = _worksheet.get_Range(HeaderFirstCell, _miss);
        headerRng = headerRng.get_End(XlDirection.xlToRight);
        headerRng = _worksheet.get_Range(HeaderFirstCell, headerRng);
        var headerData = (object[,])headerRng.Value2;
        return headerData.GetLength(1);
    }

    public virtual object[,] GetData()
    {
        var last = _worksheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing);
        var dataRng = _worksheet.get_Range(DataFirstCell, last);
        return (object[,])dataRng.Value2;
    }

【问题讨论】:

  • 这很明显,但是您是否将 MockExcel.Object 传递到测试中?您还没有将其包含在代码中
  • 很抱歉省略了那部分代码,是的,我正在使用 MockExcel.Object,我能够通过让 GetData() 返回一个对象并将返回的对象转换为一个对象来找到一个临时解决方案[,] 在 ParseDataTable 类中。

标签: c# unit-testing mocking moq


【解决方案1】:

如果您从 ExcelManager 中提取一个接口作为接口(您可以将其称为 IExcelManager,但告诉大家我想出了一个绝妙的名字:-),那不是更容易吗?如果你通过了,那么你的嘲笑困难应该不那么痛苦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    相关资源
    最近更新 更多