【发布时间】:2018-12-04 17:45:15
【问题描述】:
我在这里的第一个问题。我查看了我的查询,但找不到有用的答案。
我的任务是为我的 excel 文件编写单元测试用例。我面临的问题是我们将 Epplus 用于 excel 文件,我不确定如何为此编写单元测试用例。我查了一下,发现我们也可以用 MOQ 来模拟。但是我再次找不到任何有用的链接来模拟使用 Epplus 的 excel 文件。我找到了这个链接Unit testing classes that use EPPlus,但我不确定如何实现它。
如果有人可以提供如何为 excel 文件编写简单单元测试的示例,我将不胜感激。测试可以是检查上传的文件是否为excel文件,检查excel是否为空等。
抱歉,目前我没有任何样品。我可以分享的是我正在读取excel文件的代码:
public class MyController : Controller
{
[HttpPost("upload")]
public async Task<IActionResult> UploadFile(IFormFile file)
{
JArray data = new JArray();
using (ExcelPackage package = new ExcelPackage(file.OpenReadStream()))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
//Check if excel is empty.
if (worksheet.Dimension == null)
{
return BadRequest("File is blank.");
}
data = Helper.CreateJson(worksheet);
}
return Ok(data);
}
}
我创建了一个帮助类:
public static JArray CreateJson(ExcelWorksheet worksheet)
{
JArray data = new JArray();
JObject jobject = new JObject();
int rowCount = worksheet.Dimension.End.Row;
int colCount = worksheet.Dimension.End.Column;
for (int row = 1; row <= rowCount; row++)
{
for (int col = 1; col <= colCount; col++)
{
var value = worksheet.Cells[row, col].Value;
//Excel has 2 columns and I want to create a json from that.
if (col == 1)
{
jObject.Add("ID", rowValue.ToString());
}
else
{
jObject.Add("Name", rowValue.ToString());
}
}
data.Add(jObject);
jObject= new JObject();
}
return data;
}
这是我目前的测试课。
public class TestClass
{
private MyController _controller;
public TestClass()
{
_controller = new MyController ();
}
[Fact]
public void Upload_WhenCalled()
{
//var file = new FileInfo(@"C:\myfile.xlsx");
//...what next?
var file = new Mock<IFormFile>();
var content = File.OpenRead(@"C:\myfile.xlsx");
var result = _controller.UploadFile(file.Object);
//When I debug it throws error "Object reference not set to an instance of an object."
}
}
【问题讨论】:
-
模拟
IFormFile以返回测试中的文件流并将其传递给被测操作。确保满足所有其他必要的依赖项。最后,根据实际行为断言预期行为。 -
@Nkosi 我已经用模拟 iform 文件更新了我的代码。但它会引发错误“对象引用未设置为对象的实例”。错误在我的控制器上: ExcelPackage package = new ExcelPackage(myFile.OpenReadStream())
-
设置模拟以在调用时返回流。
file.Setup(_ => _.OpenReadStream()).Returns(content); -
现在虽然我的帮助应该可以帮助您解决当前的问题,但您应该真正接受@mason 提出的建议,将
ExcelPackage的紧密耦合从控制器中抽象出来,使其成为自己的关注点。将使测试控制器更容易。您可以随时根据需要单独测试包装器。
标签: c# asp.net-core moq epplus