PrivateObject调用抛出MissingMethodException

时间:2014-06-20 20:09:49

标签: c# unit-testing visual-studio-2012

我在Visual Studio 2012中的单元测试中有以下代码。我正在尝试在GatherData类中测试ExcelFile方法的私有方法。但是当我运行测试时,我得到MissingMethodException。如何在类中调用私有方法以便进行单元测试?

ExcelFile xFile = new ExcelFile("pathhere");
PrivateObject po = new PrivateObject(xFile);

var retVal = po.Invoke("GatherData");

以下是一些ExcelFile类:

public class ExcelFile
{

    private FileInfo excelFileInfo;
    private ExcelWorksheet workSheet;

    private Dictionary<string, string> data = new Dictionary<string, string>();

    public ExcelFile(string path)
    {
        this.excelFileInfo = new FileInfo(path);

    }

    private Dictionary<string, string> GatherData(ExcelWorksheet workSheet)
    {
        Dictionary<string, string> data = new Dictionary<string, string>();

        int endDataRow = workSheet.Dimension.Rows;

        for (int rowNumber = 2; rowNumber <= endDataRow; rowNumber++)
        {
            if (ValidateRow(rowNumber))
            {
                string columnOneValue = workSheet.Cells[rowNumber, 1].Value.ToString().Trim(),
                       columnTwoValue = workSheet.Cells[rowNumber, 2].Value.ToString().Trim();

                data.Add(columnOneValue, columnTwoValue);
            }
        }
        return data;
    }   
}

2 个答案:

答案 0 :(得分:5)

方法GatherData需要一个ExcelWorksheet类型的参数才能工作。如果您创建ExcelWorksheet的对象,然后使用代码:

ExcelFile xFile = new ExcelFile("pathhere");
PrivateObject po = new PrivateObject(xFile);

var retVal = po.Invoke("GatherData", new object[] {excelWorksheetObject});

它应该适合你。

查看此帖子了解更多详情:Running into System.MissingMethodException: Method Not Found with PrivateObject

干杯!

答案 1 :(得分:1)

通常你不应该测试类的私有方法,但是只考虑公共接口,然后在我看来,为此目的使用任何类型的反射都是完全错误的方法,无论如何在.NET中有一个测试受保护的系统使用InternalsVisibleToAttribute的内部方法,使用

修饰您的测试类
[assembly:InternalsVisibleTo("YourTestClass")]

所以你不要打破封装