【发布时间】:2014-07-19 03:42:18
【问题描述】:
我有一个在数据库中插入文件的操作。它工作正常。但是插入成功时单元测试失败。 RedirectToRouteResult 为空。这是操作的代码:
[HttpPost]
public ActionResult FileUpload(FileUploadViewModel model)
{
try
{
if (ModelState.IsValid)
{
var uploadFile = new byte[model.File.InputStream.Length];
model.File.InputStream.Read(uploadFile, 0, uploadFile.Length);
//var file = new FilesUpload();
var fileExt = Path.GetExtension(model.File.FileName);
if (fileExt == ".txt" || fileExt == ".docx")
{
//file.FileName = model.File.FileName;
//file.FileSize = model.File.ContentLength;
//file.ContentType = fileExt;
//file.FileData = uploadFile;
//file.UploadedOn = DateTime.Now;
//var user = _userRepository.GetUserId(User.Identity.Name);
//file.UserId = user.UserId;
bool result = _userRepository.UploadFile(model, User.Identity.Name, fileExt, uploadFile);
//file.User = (from u in _context.Users where u.UserId == 29 select u).FirstOrDefault();
//_context.FilesUploads.Add(file);
//int result = _context.SaveChanges();
if (result)
{
return RedirectToAction("Index");
}
else
{
ModelState.AddModelError("", "An error occured");
return View(model);
}
}
else
{
ModelState.AddModelError("", "You can upload only files with extensions .txt and .docx");
}
}
return View(model);
}
catch (Exception ex)
{
throw(ex);
}
}
这是单元测试的代码:
private SuperUserController _controller;
private Mock<IUserRepository> _repositoryMock;
private Mock<IIntrinsicObjects> _intrinsicMock;
private Mock<ControllerContext> _contextMock;
private string username = "test@abv.bg";
private FileUploadViewModel _fileUpload;
[SetUp]
public void Setup()
{
_fileUpload = new FileUploadViewModel();
_repositoryMock = new Mock<IUserRepository>();
_intrinsicMock = new Mock<IIntrinsicObjects>();
_contextMock = new Mock<ControllerContext>();
_contextMock.SetupGet(c => c.HttpContext.User.Identity.Name).Returns(username);
_contextMock.SetupGet(c => c.HttpContext.User.Identity.IsAuthenticated).Returns(true);
_controller = new SuperUserController(_repositoryMock.Object, _intrinsicMock.Object);
_controller.ControllerContext = _contextMock.Object;
}
[Test]
public void FileUpload_ShouldRedirectToIndexOnSuccess()
{
string filePath = Path.GetFullPath(@"C:\Users\Test\Desktop\test.txt");
var fileStream = new FileStream(filePath, FileMode.Open);
var fileExt = Path.GetExtension(filePath);
var fileToUpload = new Mock<HttpPostedFileBase>();
fileToUpload.Setup(f => f.ContentLength).Returns(10);
fileToUpload.Setup(f => f.FileName).Returns("test.txt");
fileToUpload.Setup(f => f.ContentType).Returns(fileExt);
fileToUpload.Setup(f => f.InputStream).Returns(fileStream);
//var model = new FileUploadViewModel();
_fileUpload.File = fileToUpload.Object;
var fileData = new byte[fileToUpload.Object.InputStream.Length];
_repositoryMock.Setup(m => m.UploadFile(_fileUpload, _controller.ControllerContext.HttpContext.User.Identity.Name, fileToUpload.Object.ContentType, fileData)).Returns(true);
var result = _controller.FileUpload(_fileUpload) as RedirectToRouteResult;
Assert.IsNotNull(result);
}
问题是 UploadFile 总是返回 false。
如果有人帮助我,我将非常感激。
【问题讨论】: