我有一个带有网格的简单页面,我正在绑定一组对象。我还在网格上有一些简单的功能来编辑和保存行。我想为这个页面编写单元测试,但这对我来说并不合适。
例如:
Private Sub LoadGrid()
'Populate Collection
grid.datasource = MyCollection
grid.databind()
end sub
我想Sub
确实不需要单元测试,但是如果这是一个在加载网格时返回true的函数会怎样。你是如何为此编写单元测试的?还应该在像这样的简单网页上进行哪些其他测试?
一如既往,感谢所有提供任何意见的人。
答案 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测试等