2011-12-19 31 views
14

Bộ điều khiển trong ứng dụng ASP.NET MVC của tôi điền trước dữ liệu biểu mẫu được hiển thị theo quan điểm của tôi theo một số quy tắc khá thẳng về phía trước.Kiểm tra đơn vị Bộ điều khiển MVC

Có vẻ như đây sẽ là một điều tốt để trang trải trong thử nghiệm đơn vị của tôi. Nhưng cách duy nhất tôi có thể nhìn thấy để xác minh dữ liệu chính xác được đặt trong biểu mẫu, sẽ là trích xuất logic từ bộ điều khiển theo những gì cảm thấy giống như một cách không tự nhiên.

Ai đó có thể đề xuất các cách tiếp cận vấn đề này?

Tất cả các ví dụ tôi đã tìm thấy trong các bộ điều khiển thử nghiệm đơn vị có vẻ rất tầm thường, chẳng hạn như xác minh nó đã trả về kiểu xem dự kiến. Tôi không chắc tôi thậm chí còn thấy giá trị trong đó.

Trả lời

21

Bạn có thể thử nghiệm bằng cách đúc các đối tượng quay trở lại lớp học phù hợp, thay vì sử dụng lớp học của họ cơ sở (được trả về bởi mặc định)

Ví dụ, để kiểm tra mặc định AccountController bạn muốn để một cái gì đó như thế này:

var controller = new AccountController(); 
var result = controller.LogOn() as ViewResult; 
var model = result.Model as LogOnModel; 

Assert.IsTrue(model.RememberMe); // assuming you "pre-populated" enabled the checkbox 

Kiểm tra xem đối tượng được trả về có đầy đủ dữ liệu không có vẻ "không tự nhiên" đối với tôi hay bạn có ý nghĩa khác không?

+1

Ah ... 'result.Model' trông hữu ích. –

11

Tôi đồng ý rằng việc kiểm tra loại chế độ xem được trả lại sẽ hơi vô nghĩa. Tuy nhiên, thử nghiệm rằng "xem" dự kiến ​​đã được trả lại cùng với dữ liệu chính xác của nó sẽ là một trường hợp thử nghiệm hợp lệ IMO.

Ví dụ ở đây là trường hợp kiểm tra chỉnh sửa số ít cho trình điều khiển chỉnh sửa. Lưu ý, ví dụ này là việc sử dụng Moq và Nunit nhưng nó sang một bên nó khá thẳng về phía trước.

Lưu ý rằng ViewResult được truyền tới mô hình chế độ xem dự kiến ​​và các xác nhận sau đó được thực hiện dựa trên số liên lạc dự kiến.

Test:

[Test] 
public void Edit_Get_Should_Lookup_Contact_From_Repository_And_Return_Edit_View() 
{ 
    // arrange 
    var _repository = new Mock<IContactRepository>(); 

    var expectedContact = new Contact 
    { 
     First = "first", 
     Last = "last", 
     Email = "[email protected]" 
    }; 

    var mockContext = new Mock<ControllerContext>(); 
    _repository.Setup(x => x.GetById(It.IsAny<int>())).Returns(expectedContact); 

    var controller = new ContactController(_repository.Object) 
    { 
     ControllerContext = mockContext.Object 
    }; 

    // act 
    var result = controller.Edit(1) as ViewResult; 
    var resultData = (Contact)result.ViewData.Model; 

    // assert 
    Assert.AreEqual("Edit", result.ViewName); 
    Assert.AreEqual(expectedContact.First, resultData.First); 
    Assert.AreEqual(expectedContact.Last, resultData.Last); 
    Assert.AreEqual(expectedContact.Email, resultData.Email); 
} 

Bộ điều khiển:

[HttpGet] 
public ActionResult Edit(int id) 
{ 
    var contact = _repository.GetById(id); 

    return View("Edit", contact); 
} 
Các vấn đề liên quan