我目前的项目基于Asp .net大量使用Http处理程序来处理各种请求?那么,有什么方法可以用单元测试用例来测试每个处理程序的功能?我们使用Nunit和Moq框架来促进单元测试。单元测试http处理程序?
回答
你当然可以,虽然我没有在“愤怒”中做过自己。
使用System.Net.WebClient对您的处理程序进行HTTP调用,并评估返回的内容,这将允许您测试处理程序的面向公共的界面。
在这个例子中,我对我的目标进行了硬编码,并且我在WebClient上使用了一个返回字符串的方法。
WebClient还为您提供了对ResponseHeaders,Encoding和其他有用'webby'内容的访问;你也可以上传信息。
using System.Net;
namespace UnitTestHttpHandler
{
public class TestHarness
{
public static string GetString()
{
WebClient myWebClient = new WebClient();
return myWebClient.DownloadString("http://localhost/Morphfolia.Web/ContentList.ashx");
}
}
}
然后,您可以使用TestHarness调用目标的HttpHandler,并在您的测试验证结果(或使用更好的方法来你的测试,如果你知道一个 - 我不是一个单元测试大师)。
[TestMethod]
public void TestMethod1()
{
string x = UnitTestHttpHandler.TestHarness.GetString();
Assert.IsTrue(x.Length > 5);
}
这是一篇文章,清楚地解释了http处理程序的单元测试。
http://jgvimalan.wordpress.com/2011/08/30/unit-test-for-http-handler/
你可以使用在其他的答案中提到的方法,做单元测试,你将需要创建一些接口,并提取核心功能出了处理程序,以及处理程序的集成测试创建一些模拟对象。
你将无法单元测试它的所有部分,因为它依赖于外部资源(那些你会嘲笑的) - 但这很好,这就是为什么我们有集成测试。
我想从一个虽然这些博客文章背后,是相关的:
http://www.kongsli.net/nblog/2009/05/03/aspnet-35-improving-testability-with-systemwebabstractions/
见例如#2在第一篇文章为例如何单元测试一个HttpHandler。
如果您想测试处理程序和Web UI之间的通信,那么是的,集成测试是实现这一目标的方法。为了单元测试你的逻辑,你能不把你的业务逻辑分成其他类(我会为业务层使用一个单独的程序集),并且模拟/单元测试这些类,而不是在表示层之外?
一旦你有一个已经与表示层分离的结构化(和单元测试)业务层,你的处理程序可以简单地实例化你的concretes并调用提供的方法。一旦完成,您就可以进行集成测试,因为您的业务逻辑将经过单元测试。
如果你不关心单元测试和想要的东西快速和肮脏的,你可以使用Fiddler
如果你想要一个更加综合的方法(单元测试),您可以使用WebRequest和WebResponse。
但是我们需要将请求路由(使用配置文件)到正确的处理程序,服务器也需要运行,对吧?那么如何模拟呢? – 2010-05-18 04:59:09
是的,一个Web服务器将需要运行。就配置而言,我不能说经验,但我会认为它将以类似的方式通过单元测试(?)通过配置指定其他设置。对不起,我不能提供比这更多的东西。 – 2010-05-25 09:08:44
这实际上工作得很好,唯一的问题是你无法通过你的目标处理程序进行调试。 – Brent 2015-01-16 13:58:15