我在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;
}
}
答案 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")]
所以你不要打破封装