【发布时间】:2012-06-01 01:03:53
【问题描述】:
我正在尝试使用 NSubstitute 或其他模拟框架和 MSTest (Visual Studio 2010) 模拟 Excel 电子表格。我不确定是否有比这更好的方法——而且这对测试不太有效:
这里是一个例子(现在都是原型代码,不是很干净):
int[] lowerBounds = { 1, 1 };
int[] lengths = { 2, 2 };
//Initialize a 1-based array like Excel does:
object[,] values = (object[,])Array.CreateInstance(typeof(object), lengths, lowerBounds);
values[1,1] = "hello";
values[2,1] = "world";
//Mock the UsedRange.Value2 property
sheet.UsedRange.Value2.Returns(values);
//Test:
GetSetting(sheet, "hello").Should().Be("world"); //FluentAssertions
到目前为止,一切顺利:如果 GetSetting 方法与我的测试在同一个项目中,则通过。但是,当 GetSetting 在我的 VSTO Excel-Addin 项目中时,它会在 GetSetting 函数的第一行出现以下错误:
System.MissingMethodException: Error: Missing method 'instance object [MyExcel.AddIn] Microsoft.Office.Interop.Excel.Range::get_Value2()' from class 'Castle.Proxies.RangeProxy'.
作为参考,GetSetting 从工作表中的 columnA 中获取一个值,并返回 columnB 中的值。
public static string GetSetting(Excel.Worksheet sheet, string settingName) {
object[,] value = sheet.UsedRange.Value2 as object[,];
for (int row = 1; row <= value.GetLength(1); row++) {
if (value[1, row].ToString() == settingName)
return value[2, row].ToString();
}
return "";
}
最后一个有趣的部分是如果我重新定义我的方法的签名如下:
public static string GetSetting(dynamic sheet, string settingName)
它适用于 VSTO 项目。
那么发生了什么,做这种事情的最佳方法是什么?
谢谢!
【问题讨论】:
-
这听起来像是一个缺少引用的情况。
-
运行测试时,bin目录下的microsoft.office.tools.excel.dll是否存在?
-
就我而言,在我的测试项目(在我的情况下为 Microsoft.Office.Interop.Word)中为 DLL 关闭“嵌入互操作类型”并打开“本地复制”解决了该错误。谢谢。
标签: c# excel mocking vsto nsubstitute