Answers:
是的你可以。您只需要小心地将问题分开即可。简而言之,您必须从代码背后删除所有逻辑,然后将其放入其他类中。
有两种常见的方法可以做到这一点。
简单的方法是根据“系统给我什么信息?我需要在页面上填充什么信息?”来重新考虑所有事件处理程序。然后提供进行该转换的服务类。
在这种情况下,服务层应该对表示层的性质了解甚少。您仍然必须获取从服务返回的数据,并在代码中填充WebForm的正确组件,并且这未经测试(至少通过单元测试,您仍然可以使用集成测试)。但这很少是代码出错的地方,它更有可能在逻辑上失败。
一种更复杂但更有效的方法是使用Model View Presenter模式。当我们尝试进行此操作时,我们发现Presenters很快就与该框架紧密结合,并且我们开发MVP越多,就越清楚地表明MVP确实想成为MVC,但不能成为MVC。
也就是说,其他人已经非常成功地完成了此操作-甚至还有一个webformsmvp框架可用来消除繁重的工作-因此您的工作量可能会有所不同。
显然,整个Web表单页面不是一个单元,因此无法进行单元测试。但是,您可以为自动测试做一些事情:
很抱歉错过问题的“单元”部分。
SeleniumHQ是您从前端进行测试的朋友。它不是单元测试,更像是黑盒测试。您仍然需要考虑有效的测试用例...
从经验上讲:只有做对了。我所说的“正确”是指在代码后面隐藏最少的代码,以及使Web表单“笨拙”的类似于上述Model-View-Presenter的东西。事实证明,对于棕地应用程序,这非常困难,因为它们并不是在设计时就考虑到这一点的,并且重构/重写页面以使用它是费力的工作。
我发现单元Web测试非常有用,即使只是为了给出回归错误或针对新项目的总体思路。
就状态而言,您可以像使用非UI测试一样创建单元测试-它们在测试开始时清除数据库,并重建数据库以包含除了开始状态以外的任何内容。然后,每个单元测试将封装一个页面,或者通常封装一个页面上的不同任务。
http://watin.org/是用于C#/。NET的另一个Web测试工具。您将测试编写为单元测试:
[Test]
public void SearchForWatiNOnGoogle()
{
using (var browser = new IE("http://www.google.com"))
{
browser.TextField(Find.ByName("q")).TypeText("WatiN");
browser.Button(Find.ByName("btnG")).Click();
Assert.IsTrue(browser.ContainsText("WatiN"));
}
}
它目前基于IE,但对Firefox和Chrome具有一些实验性支持。您几乎可以自动化您在手动测试中可以执行的任何操作,包括Javascript交互。
在过去的5年中,Jasmine已经成为前端单元测试的关键工具。它通常与Node和npm结合到自动构建测试中
每个https://en.wikipedia.org/wiki/Jasmine_(JavaScript_testing_framework):
Jasmine是JavaScript的开源测试框架。[2] 它旨在在任何支持JavaScript的平台上运行,不侵入应用程序或IDE,并具有易于阅读的语法。它受到其他单元测试框架的严重影响,例如ScrewUnit,JSSpec,JSpec和RSpec。[3]
尽管提到了javascript,但它也可以用于纯Web表单的单元测试。
在开发ASP.NET网站时,我们可以在以下单元上运行单元测试:
根据您的体系结构,可以对所有这些进行TDD。您无法进行单元测试的唯一一件事就是标记文件的布局。