Настройка свойства Row для посмешивания Microsoft.Office.Interop.Excel.Range with Mock

Я хочу высмеять Microsoft.Office.Interop.Excel.Range и после того, как сможет получить свойство Row (индекс первого ряда диапазона). Moq v 4.1.1309.1617 / nunit.framework v 2.6.3.13283 В моем модульном тесте я пытаюсь настроить поведение макета следующим образом:

var moqRowSelected = new Mock<Range>(); const int row = 1; moqRowSelected.SetupGet(x => x.Row).Returns(row); moqSheetBase.SetupProperty(x => x.RowSelected, moqRowSelected.Object); 

В тестируемом модуле я использую Range следующим образом:

 var iRow = PlanningSheet.RowSelected.Row; Range row = sheet.Rows[iRow]; 

Когда тест выполняется, он создает следующее исключение:

Ошибка: отсутствующий метод 'instance int32 [My.Example.Implementation.MyClass] Microsoft.Office.Interop.Excel.Range :: get_Row ()' из класса 'Castle.Proxies.RangeProxy'.

Как я могу реализовать это издевательство успешно? Может кто-нибудь мне помочь, спасибо.

Я думаю, что вы правильно издевались над объектом, на который ссылается PlanningSheet.RowSelected , поэтому iRow должен быть правильным. Однако вы не правильно издевались над диапазоном, возвращаемым листом.

Давайте перепишем тестируемый код следующим образом.

  var iRow = PlanningSheet.RowSelected.Row; Range rows = sheet.Rows; Range row = rows.get_Range(iRow); 

Держу пари, что макет, содержащийся в строках переменных, не содержит реализацию для get_Range (), чей метод относится к индексированному свойству.

Лично я избегаю индексированного свойства из-за насмешливой проблемы, см. Mocking indexed property

Итак, вот код, который, похоже, позволяет насмехаться в вашем случае. Обратите внимание, что у меня нет доступа к типу PlanningSheet, поэтому я передаю объект, на который ссылается свойство RowSelected, как параметр метода CodeUnderTest

  private Range CodeUnderTest(Range rowSelected, Worksheet worksheet) { int index = rowSelected.Row; var range = worksheet.Rows.get_Range(index); return (Range) range; } [TestMethod] public void MySampleTest() { var moqRowSelected = new Mock<Range>(); const int row = 1; moqRowSelected.SetupGet(x => x.Row).Returns(row); var moqRows = new Mock<Range>(); moqRows.Setup(x => x.get_Range(It.Is<object>( (i) => (int) i==row),It.IsAny<object>())).Returns(moqRowSelected.Object); var mockWorksheet = new Mock<Worksheet>(); mockWorksheet.SetupGet(w => w.Rows).Returns(moqRows.Object); var result = CodeUnderTest(moqRowSelected.Object, mockWorksheet.Object); Assert.IsNotNull(result); } 

Наконец, вы увидите, что вы должны предоставить все параметры методу get_Range в макете. Это потому, что, если вы этого не сделаете, он не будет компилироваться. Ошибка ясна . Дерево выражений не может содержать вызов или вызов, который использует необязательные аргументы .

  • Не удалось открыть Excel из теста при запуске с помощью Code Coverage в Visual Studio
  • Как я могу получить данные из двух разных источников в тесте Nunit?
  • Как проверить, выделена ли какая-либо ячейка без заголовка в файле Excel жирным шрифтом или курсивом
  • Тестирование устройства с помощью источника данных Excel с помощью Nunit
  • Идентификатор кода кодированного пользовательского интерфейса. Строка подключения Excel не работает.
  • Interesting Posts

    Как объединить несколько листов excel в отдельный лист Excel с вкладками?

    Outlook «Делать» элементы в Excel с помощью VBA

    Почему эта блокировка? Перебирайте все строки, выполняйте функцию по дублированию, удалите повторяющуюся строку

    Подтвердить автоматически файл Excel VBA

    Компонент VBA WinHttp

    как получить дату, рассчитанную с определенной даты с рангом месяцев в excel

    Как написать эту вложенную функцию IF в Excel

    Пользовательская функция Ввод массива результатов в другую ячейку

    Как заставить ADO.Net использовать только System.String DataType в чтениях TableSchema

    Автоматическая десятичная вставка

    Excel – найти все ячейки, содержащие значение и изменить цвет фона

    Несогласованная ошибка 1004

    Как добавить ячейки Excel в словарь Python с помощью PyXll

    если вы определяете переменную внутри цикла, она все еще определена после закрытия цикла?

    Java – запись строк в файл CSV

    Давайте будем гением компьютера.