Ich versuche, eine Excel-Tabelle mit NSubstitute oder andere Mocking-Framework und MSTest (Visual Studio 2010) zu spiegeln. Ich bin nicht sicher, ob es einen besseren Weg als diese - und das funktioniert nicht ganz für die Prüfung:
Hier ist ein Beispiel (dies ist alles Prototyp-Code im Moment, und nicht sehr sauber):
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
So weit, so gut: Dies funktioniert, wenn die GetSetting-Methode in demselben Projekt als mein Test. Jedoch wenn GetSetting in meinem VSTO Excel-Addin-Projekt ist, schlägt es mit dem folgenden Fehler in der ersten Zeile der GetSetting-Funktion fehl:
System.MissingMethodException: Error: Missing method 'instance object [MyExcel.AddIn] Microsoft.Office.Interop.Excel.Range::get_Value2()' from class 'Castle.Proxies.RangeProxy'.
Als Referenz greift GetSetting auf einen Wert aus SpalteA im Blatt zu und gibt den Wert in SpalteB zurück.
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 "";
}
Interessant wird es schließlich, wenn ich die Signatur meiner Methode wie folgt neu definiere:
public static string GetSetting( dynamisch sheet, string settingName)
es funktioniert im VSTO-Projekt.
Was ist also los, und wie kann man so etwas am besten angehen?
Danke!