Класс модульного тестирования, который требует данных файла? - PullRequest
0 голосов
/ 15 ноября 2018

Я работаю над расширением нашего набора модульных тестов, и я столкнулся с определенным классом, который я пытаюсь выяснить, как издеваться. У меня есть метод, который принимает массив байтов [] в качестве параметра. В идеальном мире этот байтовый массив всегда будет PDF-файлом, который содержит какую-то форму. Затем он извлекает все поля формы из этого PDF-файла и возвращает их.

Как я могу потенциально смоделировать логику, которая зависит от данных файла? Мои единственные реальные идеи - включить PDF-файл в проект и использовать IO для чтения тестового файла или попытаться сгенерировать PDF-форму на лету, а затем извлечь эти поля.

Вот код для экстрактора PDF:

public class PdfFormExtractor : IDisposable
{
    private readonly PdfReader _pdfReader;
    private readonly MemoryStream _newPdf;
    private readonly PdfStamper _pdfStamper;

    public PdfFormExtractor(byte[] pdf)
    {
        _pdfReader = new PdfReader(pdf);
        _newPdf = new MemoryStream();
        _pdfStamper = new PdfStamper(_pdfReader, _newPdf);
    }

    public FormDto ExtractForm()
    {
        var pdfFormFields = _pdfStamper.AcroFields;
        var form = new FormDto()
        {
            Fields = pdfFormFields.Fields.Select(n => new FormFieldDto
            {
                Name = n.Key,
                Label = n.Key
            }).ToList()
        };

        return form;
    }

    #region IDisposable Support
    // disposable implementation
    #endregion
}

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Использовать файлы ресурсов.

В Visual Studio просто создайте файл ресурсов в своем тестовом проекте, чтобы он содержал все файлы, которые вы хотите использовать в своих тестах. Откройте рекс, и вы увидите обычный список строк. Но вы не ограничены строками: вы можете выбрать «Файлы» в верхнем левом раскрывающемся списке, а затем перетащить файлы в файл resx.
Когда вы это сделаете, обратите внимание на свойства вставленного файла: вы можете выбрать интерпретацию файла как двоичного (байт [] отображается, как в вашем случае использования) или текста (с кодировкой, которая предоставляет строку).

Затем в тесте вы можете просто ссылаться на строго типизированный объект Resource и строго типизированный байт [] с содержимым тестового файла.

Эта стратегия имеет множество приложений при тестировании сложных сценариев, особенно в сочетании с достаточно умным сериализатором / десериализатором (например, Json.NET).

Вы можете сериализовать любую сложную структуру данных как Json, затем в своих тестах ссылаться на нее как на строку (предоставляемую непосредственно классом файла Resource), десериализовать ее с помощью простого JsonConvert.DeserializeObject и запустить тест непосредственно на бизнес-логике.

0 голосов
/ 16 ноября 2018

Вы можете использовать Microsoft.Fakes для создания поддельной сборки для вашего * .dll.С Fakes, мы можем согнуть результат любых свойств, методов, ..

Я подделал класс Sqlconnection, который обычно защищен от насмешек.

  1. Щелкните правой кнопкой мыши по вашей сборке ( в моем случае System.Data )
  2. Создать поддельную сборку
  3. Создает shims & stubs
  4. Нам нужно добавитьобласть с помощью (ShimsContext.Create ()).Все внутри области будет работать так, как вы предлагаете.

    public void ExtractFormTest()
    {
    using (ShimsContext.Create())
    {
        #region FakeIt
        System.Data.SqlClient.Fakes.ShimSqlConnection.AllInstances.Open = (SqlConnection sqlConnection) =>
        {
            Console.WriteLine("Opened a session with Virtual Sql Server");
        };
    
        System.Data.SqlClient.Fakes.ShimSqlConnection.AllInstances.Close = (SqlConnection sqlConnection) =>
        {
            Console.WriteLine("Closed the session with Virtual Sql Server");
        };
    
        System.Data.SqlClient.Fakes.ShimSqlCommand.AllInstances.ExecuteNonQuery = (SqlCommand sqlCommand) =>
        {
            if (sqlCommand.CommandText.ToLower().Contains("truncate table"))
            {
                Console.WriteLine("Ran " + sqlCommand.CommandText + " at Virtual Sql Server");
                return 1;
            }
    
            return 0;
        };
    
        System.Data.SqlClient.Fakes.ShimSqlBulkCopy.AllInstances.WriteToServerDataTable = (SqlBulkCopy sqlBulkCopy, DataTable datatable) =>
        {
            Console.WriteLine("Written #" + datatable.Rows.Count + " records to Virtual Sql Server");
        };
    
        System.Data.Common.Fakes.ShimDbDataAdapter.AllInstances.FillDataSet = (DbDataAdapter dbDataAdapter, DataSet dataSet) =>
        {
            var _dataSet = new DataSet();
            var _dataTable = DataTableHelper.LoadFlatfileIntoDataTable(Path.Combine(dailyEmailFlatfilesDirectory, "Flatfile.txt"), flatfileDelimiter, flatfileDataTableFields, regexPatternMdmValidEmail, traceWriter);
            if (dbDataAdapter.SelectCommand.CommandText.Equals(mdmSqlStorProcForSpFlatfileData))
            {
                while (_dataTable.Rows.Count > 1000)
                    _dataTable.Rows.RemoveAt(0);
            }
            else if (dbDataAdapter.SelectCommand.CommandText.Equals(mdmSqlStorProcForStFlatfileData))
            {
                while (_dataTable.Rows.Count > 72)
                    _dataTable.Rows.RemoveAt(0);
            }
    
            dataSet.Tables.Add(_dataTable);
            dataSet = _dataSet;
            return 1;
        };
        #endregion
    
        #region Act
        FormDto formDto = ExtractForm();
        #endregion
    
        #region Assert
        // Upto the scope of your method and acceptance criteria
        #endregion
    }
    

    }

Надеюсь, это поможет!

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