这是我的第一个问题。我已经查看了我的查询,但找不到有用的答案。
我的任务是为我的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
,以返回文件流并将其传递给要测试的操作。确保满足所有其他必要的依赖项。最后,根据实际行为断言预期行为。 - Nkosifile.Setup(_ => _.OpenReadStream()).Returns(content);
- NkosiExcelPackage
与控制器之间紧密耦合的方法,将其转化为自己的关注点。这样会使测试控制器变得更容易。你总是可以根据需要单独测试包装器。 - Nkosi