Модульное тестирование метода, взаимодействующего с библиотекой взаимодействия Excel - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь стать лучше в написании более чистого кода и разработке автоматических тестов для методов в приложениях, чтобы быстрее тестировать приложение и писать более гибкий и расширяемый код. Хотя я думаю, что понимаю основы модульного тестирования, у меня возникают проблемы при разработке теста для конкретного 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);
        }
    }
}

Есть ли какие-либо советы о том, как изменить код так, чтобы он был более расширяемым, и я мог бы написать для него модульный тест? Любые другие советы о том, как улучшить класс и методы для лучшей реализации лучшего объектно-ориентированного дизайна, также будут высоко оценены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...