2011-11-29 72 views
14

Sử dụng MVC3.NET Tôi có phương pháp tải lên tệp trong bộ điều khiển hoạt động tốt với chữ ký sau public ActionResult UploadFile(IEnumerable<HttpPostedFileBase> file)Đơn vị Kiểm tra tệp tải lên, làm cách nào?

Tôi có thể kiểm tra điều này bằng NUnit bằng cách nào? Tôi đã nhìn xung quanh và tất cả mọi người dường như chỉ đến Moq nhưng tôi mới để thử nghiệm đơn vị và không thể có được Moq làm việc.

Tôi đã tìm thấy các blog thú vị như thế này: http://danielglyde.blogspot.com/2011/07/tdd-with-aspnet-mvc-3-moq-and.html nhưng tôi đang cố gắng tìm ra cách thức tương tự có thể được thực hiện để 'giả mạo' tải lên tệp và tôi cũng cảnh giác rằng rất nhiều ví dụ moq mà tôi đã tìm thấy bây giờ dường như đã không dùng mã trong đó. Tôi chỉ đơn giản muốn biết làm thế nào tôi có thể mô phỏng một HttpPostedFileBase vì vậy tôi có thể kiểm tra mã tải lên của tôi, bằng cách sử dụng Moq hoặc cách khác - Tôi sẽ thực sự biết ơn nếu ai đó có thể cho tôi một số ví dụ mã về cách thực hiện điều này.

Các mã sau đây được lấy từ ví dụ khác về ở đây:

var file = new Mock<HttpPostedFileBase>(); 
      file.Setup(f => f.ContentLength).Returns(1); 
      file.Setup(f => f.FileName).Returns("test.txt"); 

controller.upload(file); 

tạo ra lỗi sau khi tôi cố gắng biên dịch:

không thể chuyển đổi từ 'Moq.Mock' để 'System. Web.HttpPostedFileBase '

Tôi đã thay đổi phương pháp để có một HttpPostedFileBase đơn lẻ bây giờ, thay vì một IEnumerable , khi có thể 'giả' là điều tôi đang cố gắng tập trung vào cho mục đích của câu hỏi này.

+0

Xem câu hỏi http://stackoverflow.com/questions/5515404/how-to-unit-test-asp-net-mvc-fileupload – wnascimento

+0

Tôi muốn có thể chuyển đối tượng vào phương thức từ phương pháp thử nghiệm sẽ cho phép tôi kiểm tra mã bên trong nó, vì vậy tôi muốn thực hiện điều này từ một phương thức kiểm tra: controller.UploadFile (fakeObjectHereButDontKnowHow). Ví dụ Chris Sainty chứa rất nhiều mã lỗi thời, tôi nghĩ vậy. Như tôi đã nói, tôi đã vật lộn với một số tài liệu trực tuyến cho moq .. – DevDave

Trả lời

23

Giả sử một hành động tập tin tải lên chuẩn:

[HttpPost] 
public ActionResult UploadFile(IEnumerable<HttpPostedFileBase> files) 
{ 
    foreach (var file in files) 
    { 
     var filename = Path.Combine(Server.MapPath("~/app_data"), file.FileName); 
     file.SaveAs(filename); 
    } 
    return View(); 
} 

bạn có thể kiểm tra nó như thế này:

[Test] 
public void Upload_Action_Should_Store_Files_In_The_App_Data_Folder() 
{ 
    // arrange 
    var httpContextMock = new Mock<HttpContextBase>(); 
    var serverMock = new Mock<HttpServerUtilityBase>(); 
    serverMock.Setup(x => x.MapPath("~/app_data")).Returns(@"c:\work\app_data"); 
    httpContextMock.Setup(x => x.Server).Returns(serverMock.Object); 
    var sut = new HomeController(); 
    sut.ControllerContext = new ControllerContext(httpContextMock.Object, new RouteData(), sut); 

    var file1Mock = new Mock<HttpPostedFileBase>(); 
    file1Mock.Setup(x => x.FileName).Returns("file1.pdf"); 
    var file2Mock = new Mock<HttpPostedFileBase>(); 
    file2Mock.Setup(x => x.FileName).Returns("file2.doc"); 
    var files = new[] { file1Mock.Object, file2Mock.Object }; 

    // act 
    var actual = sut.UploadFile(files); 

    // assert 
    file1Mock.Verify(x => x.SaveAs(@"c:\work\app_data\file1.pdf")); 
    file2Mock.Verify(x => x.SaveAs(@"c:\work\app_data\file2.doc")); 
} 

Rõ ràng tất cả các phần thiết lập HttpContext nên được ra ngoài vào một reusable class mà có thể được gọi theo trình [SetUp] giai đoạn thử nghiệm đơn vị của bạn để chuẩn bị bối cảnh giả của đối tượng đang được thử nghiệm và tránh lặp lại nó trong mọi thử nghiệm đơn vị.

Các vấn đề liên quan