2013-06-19 33 views
6

Tôi đang trong quá trình viết một số kiểm tra đơn vị cho bộ điều khiển của chúng tôi. Chúng tôi có bộ điều khiển đơn giản sau đây.Kiểm tra đơn vị Hoạt động điều khiển trong MVC4 với giao diện người dùng Kendo

public class ClientController : Controller 
{ 

    [HttpPost] 
    public ActionResult Create(Client client, [DataSourceRequest] DataSourceRequest request) 
    { 
     if (ModelState.IsValid) 
     { 
      clientRepo.InsertClient(client); 
     } 

     return Json(new[] {client}.ToDataSourceResult(request, ModelState)); 
    } 
} 

Các đơn vị kiểm tra việc này là như sau:

[Test] 
public void Create() 
{ 
     // Arrange 
     clientController.ModelState.Clear(); 

     // Act 
     JsonResult json = clientController.Create(this.clientDto, this.dataSourceRequest) as JsonResult; 

     // Assert 
     Assert.IsNotNull(json); 

} 

Và bối cảnh điều khiển được làm giả với đoạn mã sau:

public class FakeControllerContext : ControllerContext 
    { 
     HttpContextBase context = new FakeHttpContext(); 

     public override HttpContextBase HttpContext 
     { 
      get 
      { 
       return context; 
      } 
      set 
      { 
       context = value; 
      } 
     } 

    } 

    public class FakeHttpContext : HttpContextBase 
    { 
     public HttpRequestBase request = new FakeHttpRequest(); 
     public HttpResponseBase response = new FakeHttpResponse(); 

     public override HttpRequestBase Request 
     { 
      get { return request; } 
     } 

     public override HttpResponseBase Response 
     { 
      get { return response; } 
     } 
    } 

    public class FakeHttpRequest : HttpRequestBase 
    { 

    } 

    public class FakeHttpResponse : HttpResponseBase 
    { 

    } 


} 

Trường hợp ngoại lệ xảy ra khi những nỗ lực hành động Create điều khiển để gọi phương thức ToDataSourceResult.

System.EntryPointNotFoundException : Entry point was not found. 

Gỡ lỗi cho thấy từ điển nội bộ ModelState trống trong thử nghiệm đơn vị (chứ không phải khi chạy trong ngữ cảnh chuẩn). Nếu ModelState bị xóa khỏi phương thức ToDataSourceResult thì thử nghiệm sẽ thành công. Bất kỳ sự giúp đỡ nào cũng được đánh giá cao.

Trả lời

5

Một đỉnh nhanh chóng trong JustDecompile tiết lộ rằng Kendo.Web.Mvc.dll được xây dựng chống System.Web.Mvc phiên bản 3.0. Dự án thử nghiệm của bạn có thể tham khảo phiên bản mới hơn ASP.NET MVC (4.0) và vì vậy khi chạy bất kỳ cuộc gọi nào, thành viên sẽ dẫn đến System.EntryPointNotFoundException vì những thành viên đó không thể giải quyết được. Trong trường hợp cụ thể của bạn, các cuộc gọi đến phương pháp mở rộng KendoUI MVC ToDataSourceResult() và cuộc gọi tiếp theo của nó để ModelState.IsValid là thủ phạm.

Lý do tất cả hoạt động không có lỗi trong ứng dụng của bạn là do dự án của bạn được định cấu hình theo mặc định, như một phần của mẫu dự án Visual Studio ASP.NET MVC, thành redirect assembly bindings để thời gian chạy nhắm mục tiêu phiên bản ASP mới nhất. NET MVC được lắp ráp. Bạn có thể sửa dự án thử nghiệm của mình bằng cách thêm thông tin liên kết thời gian chạy tương tự trong tệp App.config của mình:

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
       <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
       <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Tôi hy vọng điều đó sẽ hữu ích.

+0

Rất cám ơn ... không bao giờ tự mình đi đến kết luận này. – aponzani

+0

Câu trả lời này đã lưu lại ngày của tôi! – vcRobe

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