Estoy tratando de burlarme de una hoja de cálculo de Excel usando NSubstitute u otro marco de burla y MSTest (Visual Studio 2010). No estoy seguro de si hay una manera mejor que esto - y esto no funciona bien para las pruebas:¿Cómo evito el uso dinámico cuando me burlo de una hoja de cálculo Excel?
He aquí un ejemplo (esto es todo el código prototipo de este momento, y no muy limpio):
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
Hasta ahora, todo bien: esto pasa si el método GetSetting es en el mismo proyecto como mi prueba. Sin embargo, cuando GetSetting está en mi proyecto VSTO Excel-Addin, se produce el siguiente error en la primera línea de la función GetSetting:
System.MissingMethodException: Error: Missing method 'instance object [MyExcel.AddIn] Microsoft.Office.Interop.Excel.Range::get_Value2()' from class 'Castle.Proxies.RangeProxy'.
Como referencia, el GetSetting agarra un valor de columna en la hoja, y vuelve el valor en el 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 "";
}
La pieza final interesante es si redefino la firma de mi método de la siguiente manera:
GetSetting public static string (dinámica hoja, cuerda SettingName)
funciona en el proyecto VSTO.
¿Qué está pasando y cuál es la mejor manera de hacer algo como esto?
Gracias!
Esto suena como un caso de referencias faltantes de alguna manera. –
Cuando ejecuta sus pruebas, ¿está microsoft.office.tools.excel.dll en el directorio bin? – mayu
En mi caso, al desactivar "Insertar tipos de interoperabilidad" y activar "Copiar local" para el archivo DLL en mi proyecto de prueba (Microsoft.Office.Interop.Word en mi caso) se solucionó el error. Gracias. –