编写有用的单元测试

时间:2010-07-07 19:54:17

标签: asp.net unit-testing

我有一个带有网格的简单页面,我正在绑定一组对象。我还在网格上有一些简单的功能来编辑和保存行。我想为这个页面编写单元测试,但这对我来说并不合适。

例如:

Private Sub LoadGrid()
'Populate Collection
grid.datasource = MyCollection
grid.databind()
end sub

我想Sub确实不需要单元测试,但是如果这是一个在加载网格时返回true的函数会怎样。你是如何为此编写单元测试的?还应该在像这样的简单网页上进行哪些其他测试?

一如既往,感谢所有提供任何意见的人。

2 个答案:

答案 0 :(得分:2)

  

你如何为此编写单元测试?

第一步实际上是让您的表单可测试。看看this page分隔UI和BL层,有大约不同的方法来实现MVC,MVP及其所有变体,而且没有One True Way™可以做到这一点。只要您的代码是理智且一致的,其他人就能够处理您的代码。

我个人觉得以下模式在大多数情况下都适用于测试用户界面:

  • 创建代表您的模型的界面。
  • 为您的控制器创建一个类,用于处理模型的所有更新。
  • 您的观点应该听取模型的更改。

所以最后,你最终得到这样的东西(抱歉,我的VB-fu生锈了,用C#写这个):

interface IProductPageModel
{
    int CurrentPage { get; set; }
    int ItemsPerPage { get; set; }
    DataSet ProductDataSet { get; set; }
}

class ProductPageController
{
    public readonly IProductPageModel Model;
    public ProductPageController(IProductPageModel model)
    {
        this.Model = model;
    }

    public void NavigateTo(int page)
    {
        if (page <= 0)
            throw new ArgumentOutOfRangeException("page should be greater than 0");

        Model.CurrentPage = page;
        Model.ProductDataSet = // some call to retrieve next page of data
    }

    // ...
}

这是概念代码,当然,你可以看到它非常容易进行单元测试。原则上,您可以在桌面应用程序,Silverlight等中重复使用相同的控制器代码,因为您的控制器不直接依赖于任何特定的视图实现。

最后,在您的表单上,您将实现类似于以下内容的页面:

public class ProductPage : Page, IProductPageModel
{
    ProductPageController controller;

    public ProductPage()
    {
        controller = new ProductPageController(this);
    }

    public DataSet ProductDataSet
    {
        get { return (DataSet)myGrid.DataSource; }
        set { myGrid.DataSource = value; myGrid.DataBind(); }
    }

    protected void NavigateButton_OnCommand(object sender, CommandEventArgs e)
    {
        controller.NavigateTo(Convert.ToInt32(e.CommandArgument));
    }
}

这里视图和模型之间没有真正的区别 - 它们是同一个实体。我们的想法是让您的代码隐藏尽可能“愚蠢”,以便尽可能多地将可测试的业务逻辑包含在控制器中。

  

应该对a做什么其他测试   像这样简单的网页?

您需要对任何形式的表单验证进行测试,您希望确保在特殊情况下抛出异常,确保控制器方法以预期的方式更新模型,等等。

答案 1 :(得分:1)

朱丽叶是对的。

你说的代码行

'Populate Collection

这是可测试部分。如果集合为空,如果它有项目,如果它有正好42项,你可以做断言。但这将是一次整合测试。

如果你可以隔离对数据库的所有调用(返回datareader的部分),然后返回一个空的假DbDataReader,那么你可以测试UI和数据库之间的所有内容。

测试启动浏览器并验证表是否呈现,类似的是集成测试,它将依赖于IIS启动和工作(以及数据库启动和工作,除非您有可以假冒的存储库)

如果您刚刚开始,我会首先寻找所有易于测试的代码,例如对数据库有依赖性的方法,然后继续需要模拟/存根/伪造数据库服务器的tricker测试等