你如何为此编写单元测试?
首先,实际上需要让你的表单可测试。查看
这个页面以分离UI和BL层,有大量不同的方法来实现MVC、MVP及其变体,没有一种正确的方法来做到这一点。只要你的代码合理且一致,其他人就能够在你的代码上工作。
我个人发现以下模式适用于大多数UI测试:
- 创建一个表示你的模型的接口。
- 创建一个处理模型所有更新的控制器类。
- 你的视图应该监听模型的更改。
因此,最终你会得到像这样的东西(抱歉,我的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 =
}
}
这是概念代码,当然,但您可以看到它非常容易进行单元测试。原则上,由于您的控制器不直接依赖于任何特定的视图实现,因此您可以在桌面应用程序、银光等中重复使用相同的控制器代码。
最后,在您的表单端,您可以实现类似于以下的页面:
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));
}
}
在这里,视图和模型之间没有真正的区别--它们是同一实体。这个想法是尽可能使你的代码后端变得“愚蠢”,以便尽可能多的可测试业务逻辑包含在控制器中。
像这样的简单网页还应该进行什么其他测试?
您需要对任何表单验证进行测试,确保在异常情况下抛出异常,在控制器方法中更新模型的方式符合预期等等。