繁体   English   中英

需要文件数据的单元测试类?

Unit Testing class that requires file data?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在扩展我们的单元测试套件,并且遇到了一个特定的类,我正在尝试弄清楚如何进行模拟。 我有一个方法可以接受byte []数组作为参数。 在理想情况下,此字节数组将始终是包含某种形式的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 个回复

使用资源文件。

在Visual Studio中,只需在测试项目中创建一个资源文件,以包含要在测试中使用的所有文件。 打开resx,您将看到通常的字符串列表。 但您不仅限于字符串:您可以在左上角的下拉列表中选择“文件”,然后将文件拖放到resx文件中。
在执行此操作时,请注意粘贴的文件属性:您可以选择将文件解释为二进制文件(如用例所示,显示为byte [])或文本(编码格式,显示为字符串)。

然后,在测试中,您可以仅使用测试文件的内容引用强类型的Resource对象和强类型的byte []。

在测试复杂的场景时,尤其是与足够智能的序列化器/反序列化器(如Json.NET)配对时,此策略有很多应用程序。

您可以将任何复杂的数据结构序列化为Json,然后在测试中将其引用为字符串(直接由Resource文件的类公开),使用简单的JsonConvert.DeserializeObject对其进行反序列化,然后直接在业务逻辑上运行测试。

您可以使用Microsoft.Fakes为* .dll生成假程序集。 借助Fakes,我们可以弯曲任何属性,方法等的结果。

我伪造了Sqlconnection类,该类通常可以进行模拟。

  1. 右键单击您的程序集( 在本例中为System.Data
  2. 创建假货程序集
  3. 它会产生shimsstubs
  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 } 

    }

希望这可以帮助!

1 使用文件中的数据进行单元测试

我正在尝试创建一个词法分解器。 为了测试该词法还原器,我获得了具有近75000种词法还原的csv。 为了进行测试,我创建了一个单元测试,该单元读取文件并检查每一行是否导致正确的引理。 这种方法的问题在于它在第一个错误时失败,这当然是应该的。 但这并不能使我对除错器的总体进度有所了解。 ...

3 单元测试需要很多接口?

我目前正在开展我的第一个使用 TDD 和单元测试的项目。 我正在用googletest和googlemock库用 C++ 编写。 该项目需要许多具有特定功能的小类。 我主要在构造函数中使用依赖注入。 根据这个: 我什么时候应该嘲笑? 以及何时在单元测试中使用模拟对象 注入到构造函数中的依赖是单元测试 ...

4 单元测试使用文件系统的类

我有一个输出简单报告文件的类。 它从XML文件中读取一些记录ID号:每个用于查找存储在数据库中的匹配记录。 然后它将每个记录的详细信息写入CSV文件。 我想知道 - 组织它的最佳方法是什么,以便它易于测试,但遵循封装原则? 我认为除非绝对必要,否则最好避免与文件系统进行交互,以便我处 ...

5 使用File.OpenRead()对类进行单元测试

我想测试一个使用File.OpenRead()方法获取文件内容的类。 在读取文件的内容后,它会处理它们。 我创建了一个接口和一个包装静态OpenRead()方法的类。 但是我遇到了OpenRead()返回FileStream的问题,我不知道如何“模拟”文件流。 目前,我正在创建一个文 ...

6 读取配置文件的类的单元测试

我有一个类“配置”有一个方法“getConfig”读取配置文件“config.ini”,其中我有所有的应用程序配置(数据库凭据和主机,一些apis键,.....) 现在我有这个单元测试,测试配置文件中是否存在数据库条目,同时确认方法“getConfig”返回的数组具有键“database” ...

7 使用Python中的外部数据文件进行单元测试

我是python的新手,正在尝试运行注入了来自外部文件的数据的单元测试: 我在测试函数中调用isEquivalent()时遇到以下错误: 这似乎暗示了一个范围界定问题,但是我无法弄清楚如何将for循环中的值传递给测试方法。 任何建议将不胜感激。 ...

9 需要Request和Framework上下文的单元测试代码

我正在基于Apache吊索的环境中工作。 使用Junit测试,可以在编译时“正常”对我的大部分代码库进行单元测试。 有一部分功能需要通过框架传递HTTP请求的上下文才能正常工作,而要模拟我依赖的所有框架提供的对象的工作实在太困难了。 在测试构建周期中,我目前的做法是:1)使用标准J ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM