Я пытаюсь высмеять электронную таблицу Excel, используя NSubstitute или другую насмешливую структуру и MSTest (Visual Studio 2010). Я не уверен, если есть лучший способ, чем это - и это не совсем работает для тестирования:Как избежать динамического использования при издевательстве Excel.workheet?
Вот пример (это весь код прототипа прямо сейчас, и не очень чистый):
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 захватывает значение из 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 "";
}
Окончательный интересный кусок, если я переопределять подписи моего метода следующим образом:
общественности статической строки GetSetting (динамический лист, строка settingName)
он работает в проекте VSTO.
Итак, что же происходит, и что лучший способ сделать что-то подобное?
Спасибо!
Это похоже на случай отсутствия ссылок. –
Когда вы запускаете свои тесты, находится ли файл microsoft.office.tools.excel.dll в каталоге bin? – mayu
В моем случае, отключив «Вставить типы взаимодействия» и включив «Копировать локальную» для DLL в моем тестовом проекте (Microsoft.Office.Interop.Word в моем случае), разрешил ошибку. Благодарю. –