2016-12-30 17 views
20

Tôi có một chức năng trong một bộ điều khiển mà tôi đang thử nghiệm đơn vị dự kiến ​​các giá trị trong tiêu đề của yêu cầu http. Tôi không thể khởi tạo HttpContext vì nó là chỉ đọc.Mock HttpContext để kiểm tra đơn vị bộ điều khiển MVC lõi .NET?

chức năng điều khiển của tôi hy vọng một http yêu cầu giá trị tiêu đề cho "thiết bị-id"

[TestMethod] 
public void TestValuesController() 
{ 
    ValuesController controller = new ValuesController(); 

    //not valid controller.HttpContext is readonly 
    //controller.HttpContext = new DefaultHttpContext(); 

    var result = controller.Get(); 
    Assert.AreEqual(result.Count(), 2); 
} 

Có cách nào thẳng về phía trước để làm điều này mà không cần sử dụng một thư viện của bên thứ ba?

+0

* Không * sử dụng HttpContext? Toàn bộ điểm của việc sử dụng bộ điều khiển là dữ liệu đi qua các tham số của bộ điều khiển. Nếu bộ điều khiển của bạn sử dụng HttpContext để đọc dữ liệu như thể nó là một trang WebForms, bạn có một vấn đề. –

+0

@PanagiotisKanavos Giá trị trong tiêu đề là một phần thông tin cho biết cuộc gọi đến từ thiết bị di động nào. Điều này là cần thiết để lấy dữ liệu chính xác. ID thiết bị nằm trong tiêu đề vì ID là cần thiết để xác thực, được xử lý bởi bộ lọc tác vụ tùy chỉnh. Tôi có thể có thể vượt qua ID thiết bị như một tham số tuyến đường nhưng nó sẽ là dư thừa –

+0

Kiểm tra FromHeaderAttribute nhưng cũng kiểm tra trùng lặp. HttpContext được tiêm thông qua cấu hình bây giờ –

Trả lời

56

tôi đã có thể khởi tạo httpcontext và tiêu đề theo cách này:

[TestMethod] 
public void TestValuesController() 
{ 
    ValuesController controller = new ValuesController(); 
    controller.ControllerContext = new ControllerContext(); 
    controller.ControllerContext.HttpContext = new DefaultHttpContext(); 
    controller.ControllerContext.HttpContext.Request.Headers["device-id"] = "20317"; 
    var result = controller.Get(); 
    //the controller correctly recieves the http header key value pair device-id:20317 
    ... 
} 
5

Thay vì chế giễu ra HttpContext, nó có lẽ là một ý tưởng tốt hơn để lập bản đồ tiêu đề vào một tham số vào phương pháp này. Ví dụ, trong bộ điều khiển ở dưới cùng của câu trả lời này, tham số id được thiết lập để tiêu đề giá trị với một tên bằng "device-id" ... Các đơn vị kiểm tra sau đó trở thành

[TestMethod] 
public void TestValuesController() 
{ 
    ValuesController controller = new ValuesController(); 
    var result = controller.GetHeaderValue("27"); 
    Assert.AreEqual(result, "27"); 
} 

Trong khi bạn có thể giả lập HttpContext, theo ý kiến ​​của tôi nó là cái gì đó nên tránh trừ khi bạn không có sự lựa chọn. Tài liệu cho FromHeaderAttribute có thể tìm thấy tại đây FromHeaderAttribute Class.

public class ValuesController: Controller 
    { 

     public string GetHeaderValue([FromHeader(Name = "device-id")] string id) 
     { 
     return id; 
     } 
    } 
+0

Trong trường hợp của tôi, IIRC, nó là một yêu cầu để bao gồm nó trong tiêu đề http vì cùng một giá trị cần thiết để được đánh giá trong một thành phần middleware lõi .net –

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