正确的方法来为asp.net测试httpcontext对象的nunit

时间:2012-05-04 00:04:58

标签: c# asp.net tdd nunit moq

通过跟踪hanselman文章和使用FakeHttpContext,我已经能够成功地使用上下文对象对我的asp.net相关方法进行单元测试。

我被告知按如下方式构建FakeHttpContext并设置QueryString,FakeHttpContext中的服务器变量如下是不是真正的测试asp.net上下文对象。这个方法和这个测试对我来说很有效,正如hanselman文章中所提供的那样。

    public static HttpContextBase FakeHttpContext()
    {
        var context = new Mock<HttpContextBase>();
        var request = new Mock<HttpRequestBase>();
        var response = new Mock<HttpResponseBase>();
        var session = new Mock<HttpSessionStateBase>();
        var server = new Mock<HttpServerUtilityBase>();

        request.Setup(x => x.QueryString).Returns(new NameValueCollection
                {
                    {"blah","7"}, 
                    {"blah1","8"}
                });

        request.Setup(x => x.ServerVariables).Returns(new NameValueCollection
                {
                    {"SERVER_NAME","myserver"}, {"SCRIPT_NAME","myperfectscript"}, 
                    {"SERVER_PORT","80"}, {"HTTPS","www.microsoft.com"}
                });

        request.Setup(x => x.Form).Returns(new NameValueCollection
                {
                    {"TextBox1", "hello"},
                    {"Button1", "world"},
                    {"Label1", "yournamehere"}
                });

        request.Setup(x => x.Cookies).Returns(new HttpCookieCollection());

        HttpCookie cookie1 = new HttpCookie("userInfo");
        cookie1["username"] = "Tom";
        cookie1["password"] = "pass";

        request.Object.Cookies.Add(cookie1);

        HttpCookie cookie2 = new HttpCookie("compInfo");
        cookie2["companyname"] = "google";
        cookie2["companypassword"] = "googlepassword111";

        request.Object.Cookies.Add(cookie2);

        context.Setup(ctx => ctx.Request).Returns(request.Object);
        context.Setup(ctx => ctx.Response).Returns(response.Object);
        context.Setup(ctx => ctx.Session).Returns(session.Object);
        context.Setup(ctx => ctx.Server).Returns(server.Object);

        return context.Object;
    }

我被告知通过fiddler捕获文件中所有响应/请求级别参数的所有页面详细信息,将文件读入测试对象,从保存的文件中读取页面级参数(如查询字符串)然后进行测试它。

这种使用file / fiddler的方法对我来说没有意义。这只是编写大量代码来读取和正则表达文件的额外练习。

你同意我的意见吗?你在这种情况下做了什么?

1 个答案:

答案 0 :(得分:1)

我通常会声明正在访问任何资源(如文件,数据库,流等)的测试,而不是单元测试。如果您将这些测试作为更大的连续集成环境的一部分运行,那么这些测试可能会很容易失败并且您只是因为文件被锁定而得到红色构建...