将ASP.NET Page.Form存储为单元测试

Han*_*ans 8 .net c# vb.net asp.net unit-testing

Fo单元测试ASP.NET控件我需要一个存根页面.

我可以通过继承System.Web.UI.Page在单元测试中创建一个ASP.NET页面对象.但是,我找不到设置Page.Form的方法.添加具有属性(runat,server)的表单不起作用.在我的子类中重载表单不会提供所需的功能.

上下文:我尝试对一些自制的ASP.NET控件进行单元测试.这些控件需要Page和Page.Form不能为空.

有什么建议?

Ste*_*ven 3

尝试定义实现所需方法和属性的IPageand接口,并创建实现这些接口并包装 a或类的类。这样您就可以测试这些控件中的逻辑,而无需在单元测试期间调用 ASP.NET 框架。IFormPageForm

更新:

覆盖页面属性会很脆弱,并且是不可取的。相反,您应该尝试通过提取不依赖于任何 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

通过从难以测试的方法中提取逻辑,您可以直接在测试中调用这些提取的方法。例如:

[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);
}
Run Code Online (Sandbox Code Playgroud)

如果您能够将被测试的代码提取到它自己的类中并从您的 WebControl 中调用它,那就更好了。然而,这并不总是可能的。

我希望这是有道理的。