2008-11-13 48 views
43

Tôi làm cách nào để thử nghiệm Controller.ViewData.ModelState? Tôi muốn làm điều đó mà không có bất kỳ khuôn khổ giả nào.Làm cách nào để kiểm tra ModelState?

+0

Hãy cụ thể hơn. Bạn đang cố gắng thử nghiệm cái gì? – skb

Trả lời

41

Bạn không phải sử dụng Mô hình nếu bạn đang sử dụng Mẫu Kho lưu trữ cho dữ liệu của mình, tất nhiên.

Một số ví dụ: http://www.singingeels.com/Articles/Test_Driven_Development_with_ASPNET_MVC.aspx

// Test for required "FirstName". 
    controller.ViewData.ModelState.Clear(); 

    newCustomer = new Customer 
    { 
     FirstName = "", 
     LastName = "Smith", 
     Zip = "34275",  
    }; 

    controller.Create(newCustomer); 

    // Make sure that our validation found the error! 
    Assert.IsTrue(controller.ViewData.ModelState.Count == 1, 
       "FirstName must be required."); 
+1

Một công cụ sửa đổi ảo trên các lỗi sẽ tốt đẹp, nhưng có một khoản thuế sắp xếp, trông có vẻ nặng nề đối với tôi. –

+0

IMHO Giải pháp tốt hơn là sử dụng băng tải mvc. Bằng cách này, bạn nhận được hành vi thực tế hơn của bộ điều khiển của bạn, bạn nên cung cấp xác nhận mô hình để xác định số phận - thuộc tính của nó. Bài đăng dưới đây mô tả điều này (http://stackoverflow.com/a/5580363/572612). –

35
//[Required] 
//public string Name { get; set; } 
//[Required] 
//public string Description { get; set; } 

ProductModelEdit model = new ProductModelEdit() ; 
//Init ModelState 
var modelBinder = new ModelBindingContext() 
{ 
    ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(
        () => model, model.GetType()), 
    ValueProvider=new NameValueCollectionValueProvider(
         new NameValueCollection(), CultureInfo.InvariantCulture) 
}; 
var binder=new DefaultModelBinder().BindModel(
       new ControllerContext(),modelBinder); 
ProductController.ModelState.Clear(); 
ProductController.ModelState.Merge(modelBinder.ModelState); 

ViewResult result = (ViewResult)ProductController.CreateProduct(null,model); 
Assert.IsTrue(result.ViewData.ModelState["Name"].Errors.Count > 0); 
Assert.True(result.ViewData.ModelState["Description"].Errors.Count > 0); 
Assert.True(!result.ViewData.ModelState.IsValid); 
+0

Tôi thực sự thích phương pháp này. Như bạn nói, nó là tốt hơn ở thử nghiệm một mô hình đúng cách đã được trang trí với các thuộc tính xác nhận. – stevethethread

+0

Điều này thật tuyệt vời! – Ian1971

+0

Rất tiện dụng. Tôi nghĩ rằng tôi thường đồng ý với những người nói rằng bạn không nên thử nghiệm các thuộc tính mô hình của mình, vì đó là một phần của khung, nhưng có những lúc cần phải xác nhận cho tất cả các lần điều khiển trong tương lai của bạn. –

0

Thêm vào câu trả lời tuyệt vời trên, kiểm tra sử dụng tuyệt vời này của phương pháp TryValidateModel bảo vệ trong lớp Controller.

Chỉ cần tạo một lớp thử nghiệm kế thừa từ bộ điều khiển và chuyển mô hình của bạn sang phương thức TryValidateModel. Đây là liên kết: http://blog.icanmakethiswork.io/2013/03/unit-testing-modelstate.html

Toàn bộ tín dụng được chuyển đến John Reilly và Marc Talary cho giải pháp này.

+2

Xin bao gồm các giải pháp ở đây chứ không phải là liên kết giảm đến một bài viết trên blog – csharpsql

+2

Liên kết của bạn là đã chết. –

10

Để thử nghiệm Web API, sử dụng phương pháp Validate trên bộ điều khiển:

var controller = new MyController(); 
controller.Configuration = new HttpConfiguration(); 
var model = new MyModel(); 

controller.Validate(model); 
var result = controller.MyMethod(model); 
Các vấn đề liên quan