Попробуйте определить интерфейс IPage
и IForm
, который реализует необходимые методы и свойства, и создайте классы, которые реализуют эти интерфейсы и обернут класс Page
или Form
.Таким образом, вы можете проверить логику в этих элементах управления, не обращаясь к платформе ASP.NET во время модульного тестирования.
ОБНОВЛЕНИЕ:
Переопределение свойства страницы будет хрупкими не рекомендуется.Вместо этого вы должны попытаться минимизировать объем непроверяемого кода, извлекая логику в методах, которые не зависят от каких-либо специфических (трудных для тестирования) частей ASP.NET.Взгляните на следующий пример:
public class MyLabel : Label
{
protected override override void RenderContents(HtmlTextWriter writer)
{
IPage page = new PageWrapper(this.Page);
this.MethodToTest(page);
base.RenderContents(writer);
}
internal void MethodToTest(IPage page)
{
// Work with IPage interface.
if (page.IsPostBack)
{
this.Text = string.Empty;
}
}
}
Извлекая логику из методов, которые сложно проверить, вы можете вызывать эти извлеченные методы непосредственно в своих тестах.Например:
[TestMethod]
public void MethodToTest_ScenarioToTest_ExpectedBehavior()
{
// Arrange
var label = new MyLabel();
var page = new TestPage()
{
IsPostBack = true
};
// Act
label.MethodToTest(page);
// Assert
Assert.IsTrue(string.Empty, label.Text);
}
Было бы еще лучше, если бы вы могли извлечь тестируемый код в его собственный класс и вызывать его из вашего WebControl.Это, однако, не всегда возможно.
Надеюсь, это имеет смысл.