gpt4 book ai didi

asp.net - 编写有用的单元测试

转载 作者:行者123 更新时间:2023-12-02 14:26:58 24 4
gpt4 key购买 nike

我有一个带有网格的简单页面,我将对象集合绑定(bind)到该网格。我还在网格上提供了一些简单的功能来编辑和保存行。我想为此页面编写单元测试,但这对我来说没有意义。

例如:

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

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

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

最佳答案

How do you write a unit test for this?

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

我个人发现以下模式在大多数情况下适用于测试 UI:

  • 创建一个代表您的模型的界面。
  • 为 Controller 创建一个类,用于处理模型的所有更新。
  • 您的 View 应该监听模型的更改。

所以最后,你会得到这样的结果(抱歉,我的 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 等中重复使用相同的 Controller 代码,因为您的 Controller 不直接依赖于任何特定的 View 实现。

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

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));
}
}

这里 View 和模型之间没有真正的区别——它们是相同的实体。这个想法是让你的代码隐藏尽可能“愚蠢”,以便 Controller 中包含尽可能多的可测试业务逻辑。

What other test should be done on a simple webpage like this?

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

关于asp.net - 编写有用的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3198320/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com