Звучит так, будто вы не заботитесь о фактическом рендеринге элемента управления, а скорее о логике, содержащейся в элементе управления. Для этого я хотел бы предложить, что у вас есть другая проблема, помимо невозможности проверить элемент управления вне HttpContext.
Если логика относится только к элементу управления, то вы должны доверять платформе, чтобы она выполняла свою работу, и отбросить элемент управления на странице, чтобы проверить, работает ли он правильно. Если логика, которую вы пытаетесь проверить, является бизнес-логикой, то вам необходимо провести рефакторинг.
Извлеките бизнес-логику в отдельный Project / Dll где-нибудь и подумайте о реализации шаблона MVP с управлением сервером. Вам не нужно использовать большие тяжелые фреймворки, такие как WCSF. Концептуально вы можете реализовать это без особых усилий.
Создайте интерфейс, который представляет значения в вашем представлении:
public interface IOrderView
{
Int32 ID{get; set;}
String Name{get; set;}
List<Item> Items {set;}
}
Как только это будет определено, вам нужен докладчик, который осуществляет это представление:
public class OrderPresenter
{
public IOrderView View {get; set;}
public void InitializeView()
{
//Stuff that only happens when the page loads the first time
//This is only for an example:
var order = Orders.GetOrder(custId);
View.ID = order.ID;
View.Name = order.Name;
View.Items = order.Items;
}
public void LoadView()
{
//Stuff that happens every page load
}
}
Теперь серверный элемент управления может реализовать этот интерфейс и инициализировать себя с помощью OrderPresenter
public class OrderControl: Panel, IOrderView
{
private OrderPresenter Presenter{get; set;}
public OrderControl()
{
//Create new presenter and initialize View with reference
// to ourselves
Presenter = new OrderPresenter{View = this;}
}
protected override void OnLoad(EventArgs e)
{
if(Page.IsPostback)
{
_presenter.InitializeView();
}
_presenter.LoadView();
//Other normal onload stuff here...
}
//Now for the interface stuff
public Int32 ID
{
get{ return Int32.Parse(lblOrderId.Text); }
set{ lblOrderId.Text = value.ToString(); }
}
public String Name
{
get{ return lblOrderName.Text; }
set{ lblOrderName.Text = value; }
}
public List<Item> Items
{
set
{
gvItems.DataSource = value;
gvItems.DataBind();
}
}
}
И вот оно у вас! Теперь вы сможете писать модульные тесты для OrderPresenter, используя заглушенный вид. HttpContext не требуется, и у вас более четкое разделение проблем.
Если у вас уже есть вся ваша бизнес-логика, тогда я прошу прощения, но я не могу придумать какой-либо другой причины для проверки серверного элемента управления вне среды выполнения ASP.Net, кроме необходимости проверки реальной бизнес-логики. Если это является случаем, то я настоятельно рекомендую вам провести рефакторинг сейчас, прежде чем вы поймете, что кошмар обслуживания, который это в конечном итоге вызовет через Leaky Abstractions .