【问题标题】:MVC - Moq Unit Test FileContentResult (ActionResult) - NullRefernceExceptionMVC - Moq 单元测试 FileContentResult (ActionResult) - NullReferenceException
【发布时间】: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


    【解决方案1】:

    您没有正确设置 IPDFRepository 的模拟。它需要配置在调用BuildExport 时要返回的内容。否则report 将是null

    而且您也没有使用有效参数调用被测方法。您需要创建一个具体实例,否则模型将是 nullmodel.SelectedReport 并出现错误。

    [TestMethod]
    public void Report_PDFExport_Returns_ActionResult()
    {
        //Arrange
        byte[] fakePDFReport = new byte[0];
    
        var mockRepository = new Mock<IPDFRepository>();
        mockRepository
            .Setup(x => x.BuildExport(It.IsAny<PDFViewModel>()))
            .Returns(fakePDFReport);
    
        var fakeViewModel = new PDFViewModel {
            SelectedReport = "FakeReportName"
            //Set the needed properties...
        };
    
        ReportController controller = new ReportController(mockRepository.Object);
    
        //Act
        ActionResult result = controller.PDFExport(fakeViewModel);
    
        //Assert
        Assert.IsInstanceOfType(result, typeof(ActionResult));
    }
    

    【讨论】:

    • 优秀。谢谢您的帮助。我一边尝试这样的事情,一边走在正确的轨道上,但是单元测试对我来说仍然很新。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 2017-07-20
    • 2015-09-22
    • 1970-01-01
    相关资源
    最近更新 更多