代码之家  ›  专栏  ›  技术社区  ›  Frank Schwieterman

用于集成测试的存根Web服务器

  •  1
  • Frank Schwieterman  · 技术社区  · 14 年前

    我有一些集成测试,我想验证某些需求是针对第三个-[arty webserver]提出的。我在想我会用一个存根服务器来替换第三方服务器,该服务器只记录对其进行的调用。调用不需要成功,但我需要记录所做的请求(主要是路径+查询字符串)。

    我正考虑用IIS来解决这个问题。我可以1)设置一个空站点,2)修改系统的主机文件以将请求重定向到该站点,3)在每个测试结束时分析日志文件。

    这是有问题的,因为对于IIS,日志文件不会立即写入,文件会继续写入。我需要定位文件,在测试前读取内容,在测试后等待一段不确定的时间,读取更新内容等。

    有人能想出一个简单的方法吗?

    3 回复  |  直到 11 年前
        1
  •  5
  •   digEmAll    11 年前

    您可以使用System.net.httpListener( MSDN LINK )

    它作为嵌入式Web服务器工作,这意味着您甚至可以在不需要解析日志文件的情况下即时检查访问。

    我最近在代码中使用的一个类:

    class Listener
    {
        private HttpListener listener = null;
    
        public event EventHandler CommandReceived;
    
        public Listener()
        {
            this.listener = new HttpListener();
            this.listener.Prefixes.Add("http://localhost:12345/");
        }
    
        public void ContextReceived(IAsyncResult result)
        {
            if (!this.listener.IsListening)
            {
                return;
            }
            HttpListenerContext context = this.listener.EndGetContext(result);
            this.listener.BeginGetContext(this.ContextReceived, this.listener);
    
            if (context != null)
            {
                EventHandler handler = this.CommandReceived;
                handler(context, new EventArgs());
            }
        }
    
        public void Start()
        {
            this.listener.Start();
            this.listener.BeginGetContext(this.ContextReceived, this.listener);
        }
    
        public void Stop()
        {
            this.listener.Stop();
        }
    }
    
        2
  •  1
  •   Noon Silk    14 年前

    是的,我认为你不需要一个完整的网络服务器。您不需要测试HTTP。

    你什么 需要测试是您正在发送和接收的基础数据结构。因此,只需为此创建测试(即,创建一个点,在这个点上,您可以使用预期的内容以及您打算接收的内容来验证生成的数据格式,等等)。

    测试数据,而不是协议(除非协议显然是自定义的)。

        3
  •  1
  •   Chris Kemp    14 年前

    我在很多项目中都做过类似的工作。

    您不想创建存根Web服务。这只是添加了一个不需要的依赖项。我所做的是创建一个模仿Web服务的API的接口。然后我创建了一个代理类,该类将调用实时系统中的Web服务。为了测试,我使用Rhinomocks创建模拟类,返回我想要测试的结果。这对我非常有用,因为我可以产生各种“意想不到的”行为,而这在实际系统中是不可能的。

    public interface IServiceFacade {
        string Assignments();
    }
    
    public class ServiceFacade : IServiceFacade {
        private readonly Service _service;
    
        public ServiceFacade(Service service) {
            _service = service;
        }
    
        public string Assignments() {
            return _service.Assignments();
        }
    }
    

    然后我的测试代码包含如下内容:

            var serviceFacade = MockRepository.GenerateMock<IServiceFacade>();
            serviceFacade.Stub(sf => sf.Assignments()).Return("BLAH BLAH BLAH");
    

            serviceFacade.Stub(sf => sf.Assignments()).Return(null);
    

            serviceFacade.Stub(sf => sf.Assignments()).Throw(new Exception("Some exception"));
    

    我觉得这个很有用。