Я только начинаю изучать, как использовать модульное тестирование с NUnit и как использовать имитацию для подделки объектов, которые мне нужно протестировать.
В настоящее время я работаю с проектом, который реализует VSTO ExcelАддин и хотел бы начать использовать модульные тесты с этим проектом.
Итак, у меня есть функция, которая принимает рабочую книгу в качестве параметра и возвращает список соответствующих рабочих листов, которые я хочу обработать.Эту функцию я бы хотел проверить.Мне «просто» нужно подделать имена рабочих листов, так как эта функция только перебирает все рабочие таблицы и проверяет их имена.
При поиске в интернет-ресурсах я пытался создать следующее решение, пытаясь подделать рабочую книгу с помощьюсписок рабочих листов со списком имен «SheetNames», который имеет тип List:
var fakeWorksheetList = new List<Excel.Worksheet>();
foreach (string sheetName in SheetNames)
{
var sheet = Mock.Of<Excel.Worksheet>();
sheet.Name = sheetName;
fakeWorksheetList.Add(sheet);
}
var fakeWorkbook = new Mock<Excel.Workbook>();
fakeWorkbook.Setup(p => p.Worksheets.GetEnumerator())
.Returns(() => fakeWorksheetList.GetEnumerator());
Но при запуске тестового кода я получаю следующее сообщение об ошибке:
variable "p" of type "Microsoft.Office.Interop.Excel.Workbook" referenced from scope "", but it is not defined
Чтоя делаю неправильноПочему лямбда-выражение в Setup () выдает мне такое сообщение об ошибке?Есть ли лучший способ подделать Список рабочих листов?
Пожалуйста, прости меня, если я показываю некоторое непонимание, поскольку я действительно только начинаю с насмешливой темы.
Это функция, которую яхочу протестировать, что мне нужно в моей надстройке, чтобы получить все рабочие листы, с которыми должна работать моя надстройка:
public static Dictionary<int, Excel.Worksheet> GetApplicableYearSheets(Excel.Workbook Workbook, int iCurrentYear = 0)
{
if (iCurrentYear <= 0)
iCurrentYear = DateTime.Now.Year;
int iFromYear = iCurrentYear - 2;
Dictionary<int, Excel.Worksheet> YearSheets = new Dictionary<int, Excel.Worksheet>();
for (int iNr = 1; iNr <= Workbook.Worksheets.Count; iNr++)
{
int iYear = 0;
string sWorksheetName = Workbook.Worksheets[iNr].Name;
if ((sWorksheetName.Trim().Length == 4) && (int.TryParse(sWorksheetName, out iYear)))
{
if ((iYear >= iFromYear) && (iYear <= iCurrentYear))
YearSheets.Add(iYear, Workbook.Worksheets[iNr]);
}
}
return YearSheets;
}
Список имен листов, которые я хочу использовать для тестирования, например:
List<string> SheetNames = new List<string>()
{
"2012",
"2013",
"2014",
"2015",
"2016",
"2017",
"2018",
"2019",
"Test",
"Spezialfälle"
};
Мой план состоял в том, чтобы протестировать вызов этой функции с помощью поддельной книги fakeWorkbook, например, следующим образом:
Assert.That(InvoicingUtils.GetApplicableYearSheets(FakeWbFullNames, iCurrentYear: 2019), Has.Exactly(3).Items);
и т. Д.