使用ThreadPool.QueueUserWorkItem从单元测试调用时不发送请求的异步http请求

时间:2014-06-20 18:30:02

标签: c# asp.net .net asp.net-mvc unit-testing

我有以下静态类,它有一个我用于fire的发送方法,忘记异步http调用。

public static class AsyncHttpRequest
{
    public static void Send(string url)
    {
        //perform an async get on the url
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.KeepAlive = false;
            ThreadPool.QueueUserWorkItem(
                o =>
                {
                    var response = request.GetResponse();
                    response.Close();
                });
        }
        catch (Exception ex)
        {
            Errors.ErrorSignal.SignalError(ex);
        }
    }
}

从Web应用程序项目调用相同的URL非常有效。但是从单元测试项目调用相同的URL不起作用。它没有调用URL。我查了提琴手。那是为什么?

在这两种情况下,我都这样称呼 -

AsyncHttpRequest.Send("http://example.com");

1 个答案:

答案 0 :(得分:0)

  

从Web应用程序项目调用相同的URL非常有效。但是从单元测试项目调用相同的URL不起作用。它没有调用URL。我查了提琴手。那是为什么?

因为单元测试框架可以快速处理所有内容。您需要在退出单元测试之前等待。

[TestMethod]
public void TestMethod()
{
    ManualResetEvent evt = new ManualResetEvent(false);

    AsyncHttpRequest.Send("someUrl", x => evt.Set());

    Assert.True(evt.Wait(100));
}

和班级

public static class AsyncHttpRequest
{
    public static void Send(string url)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.KeepAlive = false;
            ThreadPool.QueueUserWorkItem(
                o =>
                {
                    var response = request.GetResponse();
                    response.Close();
                });
        }
        catch (Exception ex)
        {
            Errors.ErrorSignal.SignalError(ex);
        }
    }

    public static void Send(string url, Action<HttpWebResponse> callback)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.KeepAlive = false;
            ThreadPool.QueueUserWorkItem(
                o =>
                {
                    var response = request.GetResponse();
                    callback(response)
                    response.Close();

                });
        }
        catch (Exception ex)
        {
            Errors.ErrorSignal.SignalError(ex);
        }
    }
}