c# excel mocking vsto nsubstitute

c# - ¿Cómo evito usar dynamic cuando me burlo de Excel.worksheet?



mocking vsto (2)

Resulta que burlarse de objetos de interoperabilidad COM muy complejos como el objeto Excel o el objeto InDesign que utiliza cualquiera de los marcos basados ​​en castillos (nsubstitute, ninject, etc.), no proporciona suficiente arranque de rendimiento. Los tiempos de ejecución para las pruebas aún se pueden medir en segundos. (Multiplicar eso por decenas o cientos de pruebas hace que las pruebas unitarias sigan siendo demasiado lentas para funcionar bajo los principios de prueba de TDD constantemente).

Probar la lógica de Excel se debe considerar como una prueba de integración, y como tal, correr contra el objeto real de Excel debería estar bien, haciendo que la burla no sea muy útil en tal escenario. Los resultados serán pruebas mucho más útiles contra un objeto real.

Probar una capa de abstracción colocada entre Excel y la aplicación permitiría realizar pruebas rápidas de la lógica de la aplicación. Y probar la capa de abstracción a excel en las pruebas de integración debería ser suficiente para probar la aplicación a fondo.

Estoy intentando 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 mejor manera que esto, y esto no funciona para la prueba:

Aquí hay un ejemplo (este es todo el código del prototipo en 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 está en el mismo proyecto que mi prueba. Sin embargo, cuando GetSetting está en mi proyecto VSTO Excel-Addin, falla con 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, GetSetting toma un valor de la columna A en la hoja y devuelve el valor en la columna B.

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 última pieza interesante es si redefinir la firma de mi método de la siguiente manera:
cadena pública pública GetSetting (hoja dinámica , string settingName)
funciona en el proyecto VSTO.

Entonces, ¿qué está pasando y cuál es la mejor manera de hacer algo como esto?

¡Gracias!


La actualización VS2012: Moq & Interop Types: ¿funciona en VS2012, falla en VS2010?

Primero: algo ha cambiado: ¿cómo evito usar dinámico cuando burlo una hoja de cálculo de Excel?

Me encontré con el mismo problema Mocking Excel objects using NSubstitute. La dinámica resolvió el problema tal como lo mencionas. Sin embargo, quería encontrar la causa raíz.

Cuando su proyecto tiene una referencia a Microsoft.Office.Interop.Excel.Extensions.dll , debe verificar si la propiedad Insertar tipos de interoperabilidad está visible. Si es eso, significa que su objetivo es .Net 4.0 (que podría adivinar a partir de la palabra clave dinámica).

Puede dejar el Proyecto de prueba orientado a .Net 4.0 pero necesita cambiar el marco .Net del Proyecto VSTO de nuevo a 3.5. Entonces es probable que tengas que hacer un casting explícito y calificar completamente las cosas para deshacerte de estos errores:

C # Office Excel Interop "el objeto no contiene la definición de" errores , aquí hay algunos ejemplos:

.Net 4.0:

if (tmpsheetName == xlApp.ActiveSheet.Name)

.Net 3.5 equivalente

Worksheet activeSheet = (Worksheet)xlApp.ActiveSheet; if (tmpsheetName == activeSheet.Name)

Otro ejemplo:

rn.Select();

.Net 4.0

xlApp.Selection.HorizontalAlignment = Constants.xlCenter; xlApp.Selection.Font.Bold = true; xlApp.Selection.Merge();

.Net 3.5 equivalente

rn.HorizontalAlignment = Constants.xlCenter; rn.Font.Bold = true; rn.Merge();

Proceda a corregir todos los errores de sintaxis de .Net 3.5 vs 4.0 según los ejemplos anteriores. No olvides eliminar el tipo de parámetro dynamic y reemplazarlo con la Worksheet original. ¡Finalmente, vuelve a encender la Prueba y pasará!

Dado todo el dolor que experimenté con Microsoft.CSharp.DLL en este hilo , soy de la opinión que prueba VSTO. Los proyectos de .NET 4.0 con Mocking Frameworks no funcionan.