Я пытаюсь стать лучше в написании более чистого кода и разработке автоматических тестов для методов в приложениях, чтобы быстрее тестировать приложение и писать более гибкий и расширяемый код. Хотя я думаю, что понимаю основы модульного тестирования, у меня возникают проблемы при разработке теста для конкретного c метода. Недавно я прошел онлайн-курс по модульному тестированию и узнал, что для написания модульных тестов для методов, которые касаются внешних ресурсов, вы должны создать класс, который реализует код, взаимодействующий с этим внешним ресурсом, и извлечь интерфейс для этого класса. таким образом, экземпляр Mock может быть создан из извлеченного интерфейса. Я думаю, что использование библиотеки Excel Interop квалифицируется как касание внешнего ресурса, а метод, над которым я сейчас работаю, предназначен для сохранения файла Excel на компьютер пользователя. Код этого метода приведен ниже.
public void Save()
{
if (DoesFileExistInDirectory())
{
semesterGradeInformationWorkbook.Save();
}
else
{
semesterGradeInformationWorkbook.SaveAs(LocationAsURL);
}
}
private bool DoesFileExistInDirectory()
{
return File.Exists(LocationAsURL);
}
в этом случае, если файл уже существует, функцию сохранения можно просто вызвать в книге. Однако, если файл не существует, в книге вызывается операция SaveAs для сохранения файла в этом месте. Код всего класса можно посмотреть здесь.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Excel = Microsoft.Office.Interop.Excel;
namespace GradeCalculator
{
public class ExcelWorksheet
{
private Excel.Application excelApplication;
private Excel.Workbook semesterGradeInformationWorkbook;
private Excel.Worksheet classInformationWorksheet;
public string Name { get; private set; }
public string LocationAsURL { get; private set; }
public int UsedRows
{
get { return this.classInformationWorksheet.UsedRange.Rows.Count; }
}
public int UsedColumns
{
get { return this.classInformationWorksheet.UsedRange.Columns.Count; }
}
public ExcelWorksheet(string name)
{
InitializeExcel();
Name = name;
LocationAsURL = Path.Combine(Properties.Settings.Default.DefaultDirectory, Name + ".xlsx");
}
private void InitializeExcel()
{
excelApplication = new Excel.Application();
semesterGradeInformationWorkbook = excelApplication.Workbooks.Add();
classInformationWorksheet = semesterGradeInformationWorkbook.ActiveSheet;
excelApplication.Visible = true;
}
public void Save()
{
if (DoesFileExistInDirectory())
{
semesterGradeInformationWorkbook.Save();
}
else
{
semesterGradeInformationWorkbook.SaveAs(LocationAsURL);
}
}
private bool DoesFileExistInDirectory()
{
return File.Exists(LocationAsURL);
}
}
}
Есть ли какие-либо советы о том, как изменить код так, чтобы он был более расширяемым, и я мог бы написать для него модульный тест? Любые другие советы о том, как улучшить класс и методы для лучшей реализации лучшего объектно-ориентированного дизайна, также будут высоко оценены.