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

时间:2010-06-16 06:24:48

标签: c# iis integration-testing

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

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

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

有人会想到更简单的方法吗?

3 个答案:

答案 0 :(得分:5)

您可以使用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();
    }
}

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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"));

我发现这非常有用。