2010-06-16 59 views
1

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

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

这是有问题的,因为IIS不会立即写入日志文件,而且文件会连续写入。我需要找到文件,在测试前阅读内容,在测试后等待不确定的时间,阅读更新内容等。

有人可以想到一个更简单的方法吗?

回答

5

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

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

I类在我的代码使用最近:

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(); 
    } 
} 
+0

很酷的解决方案,但我并不完全认为这是必要的。有用知道虽然(因此upvote)。 – 2010-06-16 06:35:58

1

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

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

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

1

我在一些项目中做了一些非常类似于此的事情。

您不想创建存根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")); 

我发现这是非常有用的。

+0

谢谢,但我真的很想在这种情况下进行集成测试。功能的最后一英里是没有记录行为的第三方库,所以我不想嘲笑。我同意mock对单元测试非常有用。 – 2010-06-16 16:25:59