【问题标题】:stub webserver for integration testing用于集成测试的存根网络服务器
【发布时间】:2010-06-16 06:24:48
【问题描述】:

我有一些集成测试,我想验证某些要求是针对第三方 [arty 网络服务器。我在想我会用一个只记录对它的调用的存根服务器替换第三方服务器。调用不需要成功,但我确实需要记录所发出的请求(主要是路径+查询字符串)。

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

这对于 IIS 来说是有问题的,日志文件不是立即写入的,而是连续写入的。我需要找到文件,在测试前读取内容,在测试后等待一段不确定的时间,读取更新内容等。

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

【问题讨论】:

    标签: c# iis integration-testing


    【解决方案1】:

    您可以使用 System.Net.HttpListener (MSDN LINK)。

    它作为嵌入式 WebServer 工作,这意味着您甚至可以即时检查访问,而无需解析日志文件。

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

    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】:

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

    需要测试的是您发送和接收的底层数据结构。因此,只需为此创建测试(即,您可以使用预期的内容以及您打算接收的内容等来验证您生成的数据格式)。

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

    【讨论】:

      【解决方案3】:

      我在很多项目中都做过类似的事情。

      您不想创建存根网络服务。这只是添加了一个你不需要的依赖项。我所做的是创建一个模仿 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"));
      

      我发现这非常有用。

      【讨论】:

      • 谢谢,但我真的很想在这种情况下进行集成测试。功能的最后一英里是具有未记录行为的第三方库,所以我不想嘲笑。我同意模拟非常适合单元测试。
      猜你喜欢
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      相关资源
      最近更新 更多