【发布时间】:2016-06-02 00:18:31
【问题描述】:
所以我发布到 MVC 控制器,它调用存储库以获取 Telerik 报告,然后导出 PDF。我在对此进行单元测试时遇到问题并不断收到错误 -
System.NullReferenceException:对象引用未设置为对象的实例。
控制器
public class ReportController : Controller
{
private IPDFRepository _pdfRepository;
//Dependency Injection using Unity.MVC5 NuGet Package
public ReportController(IPDFRepository pdfRepository)
{
_pdfRepository = pdfRepository;
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult PDFExport(PDFViewModel model)
{
byte[] report = _pdfRepository.BuildExport(model);
return File(report, "application/pdf", model.SelectedReport + ".pdf");
}
}
单元测试
[TestMethod]
public void Report_PDFExport_Returns_ActionResult()
{
//Arrange
var mockRepository = new Mock<IPDFRepository>();
mockRepository.Setup(x => x.BuildExport(It.IsAny<PDFViewModel>()));
ReportController controller = new ReportController(mockRepository.Object);
//Act
ActionResult result = controller.PDFExport(It.IsAny<PDFViewModel>());
//Assert
Assert.IsInstanceOfType(result, typeof(ActionResult));
}
现在,我意识到这与我的控制器的返回部分有关。
return File(report, "application/pdf", model.SelectedReport + ".pdf");
我可以改变它以返回字符串,再次测试并让它工作。
另外,如果我注释掉单元测试的最后两行,
//Act
//ActionResult result = controller.PDFExport(It.IsAny<PDFViewModel>());
//Assert
//Assert.IsInstanceOfType(result, typeof(ActionResult));
它将正常运行。我不知道如何绕过空引用。
【问题讨论】:
标签: c# asp.net-mvc unit-testing moq