2010-02-23 24 views
5

tôi có đoạn mã sau, mà thất bại trong thời gian chạy ...Làm thế nào tôi có thể giả lập giá trị ASP.NET ServerVariables ["HTTP_HOST"]?

var mock = new Mock<ControllerContext>(); 
mock.SetupGet(x => x.HttpContext.Request 
    .ServerVariables["HTTP_HOST"]).Returns(domain); 

** RunTime Error: Invalid setup on non-overridable property

tôi đã có một số mã trong bộ điều khiển của tôi, mà cần phải kiểm tra các tên miền dùng đã yêu cầu/đi.

Tôi không chắc chắn làm thế nào để giả lập nó? bất kỳ ý tưởng?

PS. Tôi đang sử dụng Moq framewoke trong ví dụ trên .. vì vậy tôi không chắc chắn nếu đó là một vấn đề, vv?

Trả lời

6

Bạn không thể giả lập người lập chỉ mục trên NameValueCollection vì nó không phải là ảo. Những gì tôi sẽ làm là giả định các tài sản ServerVariables kể từ đó IS ảo. Bạn có thể điền vào NameValueCollection của riêng bạn. Xem dưới đây

Dưới đây là những gì tôi sẽ làm gì:

var context = new Mock<ControllerContext>(); 
NameValueCollection variables = new NameValueCollection(); 
variables.Add("HTTP_HOST", "www.google.com"); 
context.Setup(c => c.HttpContext.Request.ServerVariables).Returns(variables); 
//This next line is just an example of executing the method 
var domain = context.Object.HttpContext.Request.ServerVariables["HTTP_HOST"]; 
Assert.AreEqual("www.google.com", domain); 
+0

HA! Tất nhiên!! <3 .. Ngoài ra, bạn đã sử dụng 'context.Setup'. Tôi đã sử dụng 'context.SetupGet' ... bất kỳ lý do tại sao bạn sử dụng nó? (Tôi thực sự thực sự mới để Moq ...) –

+0

Có lẽ có một số loại khác biệt, nhưng tôi cũng không phải là một chuyên gia về những phức tạp vì vậy tôi chỉ cần sử dụng Setup() trên bảng cho sự nhất quán :) Bài viết này có vẻ để giải thích sự khác biệt một chút, mặc dù tôi cũng sẵn sàng nghe từ một chuyên gia về vấn đề này: http://stackoverflow.com/questions/1073846/need-help-understand-moq-better – Eric

1

Bạn có thể trang trải HttpContext với giao diện và thử nó trong các thử nghiệm của bạn:

interface IHttpContextValues 
{ 
    string HttpHost { get; } 
} 

class HttpContextValues : IHttpContextValues 
{ 
    public string HttpHost 
    { 
     get { return HttpContext.Current.Request.ServerVariables["HTTP_HOST"]; } 
    } 
} 

class BaseController : Controller 
{ 
    public IHttpContextValues HttpContextValues; 
    BaseController() 
    { 
     HttpContextValues = new HttpContextValues(); 
    } 
} 

Sau đó, bạn sử dụng HttpContextValues ​​thay vì ControllerContext.HttpContext tại của bạn mã điều khiển. Bạn không phải thực hiện bất kỳ sự kết hợp nào về chế nhạo.

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