ASP MVC单元测试控制器从文件中读取

时间:2015-10-14 09:14:46

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

在我的控制器中,我有一个ActionResult方法,如下所示:

    public ActionResult Well(string slideid, string path)
    {
        var model = slideRepository.GetWells(slideid);
        var firstPath = slideRepository.MapPath(path);

        byte[] firstImageByteData = System.IO.File.ReadAllBytes(firstPath + "/" + slideid + "_first.jpg");
        string firstImageBase64Data = Convert.ToBase64String(firstImageByteData);
        string firstImageDataUrl = string.Format("data:image/png;base64,{0}", firstImageBase64Data);

        ViewBag.firstImageData = firstImageDataUrl;

        return View("Well", model);
    }

我使用Repository模式并且我已经成功测试了它直到该模型,但突然出现了一个新的需求,我需要去获取图像并在视图中显示它。我知道单元测试文件IO可以讨论它是否是一个好主意,但是由于该方法现在看来,我不确定如何测试它。有什么建议?

2 个答案:

答案 0 :(得分:1)

您可以做的是,在一个单独的类中从控制器中取出IO功能,并使该类接口驱动。接下来将实例注入控制器。

现在编写单元测试时,请注入IO接口的模拟对象并设置此模拟对象的期望。

分享有关单元测试和模拟的详细信息。

https://msdn.microsoft.com/en-us/library/ff650441.aspx

https://github.com/Moq/moq4

http://www.developerhandbook.com/unit-testing/writing-unit-tests-with-nunit-and-moq/

Testing a MVC Controller fails with NULL reference exception

现在,您不仅可以对代码进行单元测试,还可以实现更好的设计,请记住,如果您在单元测试代码时遇到任何挑战,可能还有设计改进的范围。

答案 1 :(得分:0)

你应该使用一些带接口的包装器来注入像存储库一样。例如:

public class FileSystemProvider : IFileSystemProvider
{
    private readonly IFilesLibraryConfiguration configuration;

    public FileSystemProvider(IFilesLibraryConfiguration configuration)
    {
        this.configuration = configuration;
    }

    public string ReadAllText(string virtualPath)
    {
        var fullPath = VirtualPathToFullPath(virtualPath);

        var allText = File.ReadAllText(fullPath);
        return allText;
    }

    public bool FileExists(string virtualPath)
    {
        var fullPath = VirtualPathToFullPath(virtualPath);

        return File.Exists(fullPath);
    }

    private string VirtualPathToFullPath(string virtualPath)
    {
        return HostingEnvironment.MapPath(virtualPath);
    }
}