【问题标题】:Using Moq with SystemWrapper To unit testing an Action c# MVC使用 Moq 和 SystemWrapper 对 Action c# MVC 进行单元测试
【发布时间】:2017-04-12 10:10:09
【问题描述】:

我正在尝试测试一个有 InputStream 的操作,但我真的不知道如何进行。

我正在尝试模拟类,但我注意到我们无法模拟 System.IO,因为我们没有抽象层。

所以,经过一番搜索,我倾向于使用一个添加 IO 系统抽象层并将其包装的包。是“SystemWrapper”,但我没有成功使用它。

我的目标: 是检查Excel文件头是否与canva格式相同,如果格式预期为真,否则为假。

这是我的代码:

我要测试的函数:

public bool checkFileHeaders(UploadedFile file)
{
    ExcelPackage package = new ExcelPackage(file.filePath.InputStream);
    ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
    List<string> expectedArray = new List<string>();
    List<string> array = new List<string>();
    bool checkExprectedArrayWithReelArray = true;
    switch (file.typeFile)
    {
        case "headcount":
        expectedArray.AddRange(new string[] { "MLE", "NOM", "PRENOM", "type"      });
    try
    {
        array.AddRange(new string[] { (string)worksheet.Cells["A1"].Value,   (string)worksheet.Cells["B1"].Value, (string)worksheet.Cells["C1"].Value,   (string)worksheet.Cells["D1"].Value});
    }
    catch
    {
        checkExprectedArrayWithReelArray = false;
    }
    case "File2":
    expectedArray.AddRange(new string[] { "Field1", "Field2", "Field3" });
    try
    {
        array.AddRange(new string[] { (string)worksheet.Cells["A1"].Value, (string)worksheet.Cells["B1"].Value, (string)worksheet.Cells["C1"].Value});
    }
    catch
    {
        checkExprectedArrayWithReelArray = false;
    }
}

checkExprectedArrayWithReelArray = Enumerable.SequenceEqual(expectedArray.OrderBy(t => t), array.OrderBy(t => t));
package.Dispose();
return checkExprectedArrayWithReelArray;

}

测试功能:

    [TestMethod]
    public void CheckFileHeaders_STCWithExpectedFormat_ShouldReturnTrue()
    {
        var mockFileStream = new Mock<FileStreamWrap>();

        var _mockHttpStream = new Mock<HttpPostedFileBase>();
        _mockHttpStream.Setup(f => f.InputStream)
        .Returns( ??????);


        OpsReview.Core.Parsers.UploadedFile file = new OpsReview.Core.Parsers.UploadedFile
        {
            typeFile = "stc",
            filePath = _mockHttpStream.Object
        };
        var result = _controller.checkFileHeaders(file);
        result.Should().Be(true);
    }

我的输入流的类型 或者,如果你能给我另一种方法来跟随它,你会很棒。

谢谢

【问题讨论】:

  • file.filePath.InputStream 的类型是什么?有什么理由不能只是Stream?
  • @NickBailey 如上所示,这是一个 HttpPostedFileBase
  • 您的代码与外部依赖项的耦合越紧密,您就越难进行单元测试。测试代码的难度直接反映了代码设计的好坏。如果你的代码依赖于实现问题,那么当你试图伪造它们进行测试时,你就是在为自己设置问题
  • 创建一个 Stream 派生对象并将其作为模拟的结果传递。实际上不需要系统包装器。 OpenXml 应被视为外部依赖项。
  • 提供有关被测方法的更多上下文。除了使用流之外,没有足够的信息来提供适当的帮助

标签: c# asp.net-mvc unit-testing moq systemwrapper


【解决方案1】:

您可以通过设置 InputStream 将 StreamReader 的 BaseStream 返回到测试文件来模拟它,例如:

var mockPostedFileBase = new Mock<HttpPostedFileBase>();
mockPostedFileBase.SetupGet(s => s.InputStream).Returns(new StreamReader(/* path to test file */).BaseStream);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多