Как избежать использования dynamic при имитации Excel.worksheet?

Я пытаюсь смоделировать электронную таблицу Excel, используя NSubstitute или другую фиктивную среду и MSTest (Visual Studio 2010) . Я не уверен, что есть лучший способ, чем этот, и он не совсем подходит для тестирования:

Вот пример (сейчас это всего лишь код прототипа, и не очень чистый):

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 получает значение из столбца A на листе и возвращает значение в столбце 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 "";
}

Последний интересный момент, если я переопределю сигнатуру моего метода следующим образом:
public static string GetSetting( dynamicsheet, string settingName)
это работает в проекте VSTO.

Так что же происходит и как лучше всего сделать что-то подобное?

Спасибо!

10
задан tony722 1 June 2012 в 17:06
поделиться