在我的控制器中,我有一个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可以讨论它是否是一个好主意,但是由于该方法现在看来,我不确定如何测试它。有什么建议?
答案 0 :(得分:1)
您可以做的是,在一个单独的类中从控制器中取出IO功能,并使该类接口驱动。接下来将实例注入控制器。
现在编写单元测试时,请注入IO接口的模拟对象并设置此模拟对象的期望。
分享有关单元测试和模拟的详细信息。
https://msdn.microsoft.com/en-us/library/ff650441.aspx
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);
}
}