我有一个从HttpApplication派生的类,它添加了一些额外的功能。我要对这些功能进行单元测试,这意味着我必须能够创建HttpApplication的新实例,伪造请求并检索响应对象。

我该如何精确地对HttpApplication对象进行单元测试?我目前正在使用Moq,但是我不知道如何设置所需的模拟对象。

最佳答案

不幸的是,这并不是特别容易做到,因为HttpApplication并不很容易进行模拟。没有要模拟的接口(interface),并且大多数方法未标记为虚拟方法。

我最近在HttpRequest和HttpWebResponse中遇到了类似的问题。最后,我寻求的解决方案是为我要使用的方法创建一个直接的“直通”包装器:

public class HttpWebRequestWrapper : IHttpWebRequestWrapper
    {
        private HttpWebRequest httpWebRequest;

        public HttpWebRequestWrapper(Uri url)
        {
            this.httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
        }

        public Stream GetRequestStream()
        {
            return this.httpWebRequest.GetRequestStream();
        }

        public IHttpWebResponseWrapper GetResponse()
        {
            return new HttpWebResponseWrapper(this.httpWebRequest.GetResponse());
        }

        public Int64 ContentLength
        {
            get { return this.httpWebRequest.ContentLength; }
            set { this.httpWebRequest.ContentLength = value; }
        }

        public string Method
        {
            get { return this.httpWebRequest.Method; }
            set { this.httpWebRequest.Method = value; }
        }

        public string ContentType
        {
            get { return this.httpWebRequest.ContentType; }
            set { this.httpWebRequest.ContentType = value; }
        }
}

等等

这让我针对自己的包装器接口(interface)进行了 mock 。不一定是世界上最优雅的东西,而是一种非常有用的方式,可以模拟掉框架中一些“不可模仿”的部分。

但是,在着急执行此操作之前,值得回顾一下您所获得的内容,并查看是否有更好的测试方法来避免不得不包装类。

就HttpWebRequest,HttpApplication等而言,通常没有恕我直言。

为了在模拟中设置此包装器(使用上面的HttpWebRequest示例),您可以使用Moq做类似的事情:
var mockWebRequest = new Mock<IHttpWebRequestWrapper>();
mockWebRequest.SetupSet<string>(c => c.Method = "POST").Verifiable();
mockWebRequest.SetupSet<string>(c => c.ContentType = "application/x-www-form-urlencoded").Verifiable();
mockWebRequest.SetupSet<int>(c => c.ContentLength = 0).Verifiable();

关于c# - 单元测试HttpApplication,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1182338/

10-08 23:55