Sto provando a simulare un foglio di calcolo Excel utilizzando NSubstitute o altri framework di simulazione e MSTest (Visual Studio 2010). Non sono sicuro se c'è un modo migliore di questo - e questo non funziona del tutto per il test:Come evitare di utilizzare la dinamica durante la simulazione di un foglio Excel.works?
Ecco un esempio (questo è tutto il codice prototipo in questo momento, e non molto pulita):
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
Finora, così buono: questo passa se il metodo GetSetting è nello stesso progetto come mio test. Tuttavia quando GetSetting è nel mio progetto VSTO Excel-Addin, non riesce con il seguente errore nella prima riga della funzione GetSetting:
System.MissingMethodException: Error: Missing method 'instance object [MyExcel.AddIn] Microsoft.Office.Interop.Excel.Range::get_Value2()' from class 'Castle.Proxies.RangeProxy'.
Per riferimento, il GetSetting afferra un valore da Columna nel foglio, e ritorna il valore nella colonna 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 "";
}
Il pezzo finale è interessante se io ridefinire la firma del mio metodo come segue:
pubblico GetSetting static String (dinamica foglio, stringa SettingName)
funziona nel progetto VSTO.
Quindi cosa sta succedendo e qual è il modo migliore per fare qualcosa del genere?
Grazie!
Questo suona come un caso di riferimenti mancanti in qualche modo. –
Quando si eseguono i test, microsoft.office.tools.excel.dll si trova nella directory bin? – mayu
Nel mio caso, disattivare "Embed Interop Types" e attivare "Copy Local" per la DLL nel mio progetto di test (Microsoft.Office.Interop.Word nel mio caso) ha risolto l'errore. Grazie. –