12

モック HttpWebRequest および HttpWebResponse オブジェクトを作成する方法 次のコードの単体テストを試みています

HttpWebrequest request;   

if (null != request)
{                         
    var response = (HttpWebResponse)request.GetResponse();
    using (var sr = new StreamReader(response.GetResponseStream()))
    {
        jsonResult = sr.ReadToEnd();
    }

    var myRecords = SerializationHelper.Deserialize<Records>(jsonResult);
}
4

8 に答える 8

2

HttpWebResponse をモックアウトするのではなく、HttpWebResponse のモックを作成することはできません。インターフェイスの背後で呼び出しをラップし、そのインターフェイスをモックします。

于 2013-04-22T23:58:38.007 に答える
2

これは古い質問ですが、誰かにとっては役立つかもしれません。msdnのこの質問から適応:

private static WebResponse CreateWebResponse(HttpStatusCode httpStatus, MemoryStream responseObject)
{
  TcpListener l = new TcpListener(IPAddress.Loopback, 0);
  l.Start();
  int port = ((IPEndPoint)l.LocalEndpoint).Port;
  l.Stop();

  // Create a listener.
  string prefix = "http://localhost:" + port + "/";
  HttpListener listener = new HttpListener();
  listener.Prefixes.Add(prefix);
  listener.Start();
  try
  {
    listener.BeginGetContext((ar) =>
    {
      HttpListenerContext context = listener.EndGetContext(ar);
      HttpListenerRequest request = context.Request;

      // Obtain a response object.
      HttpListenerResponse response = context.Response;

      response.StatusCode = (int)httpStatus;

      // Construct a response.
      if (responseObject != null)
      {
        byte[] buffer = responseObject.ToArray();

        // Get a response stream and write the response to it.
        Stream output = response.OutputStream;
        output.Write(buffer, 0, buffer.Length);
      }

      response.Close();
    }, null);

    WebClient client = new WebClient();
    try
    {
      WebRequest request = WebRequest.Create(prefix);
      request.Timeout = 30000;
      return request.GetResponse();
    }
    catch (WebException e)
    {
      return e.Response;
    }
  }
  finally
  {
    listener.Stop();
  }

  return null;
}

ここでは、responseObject に好きなように記述したり、null のままにしたりできます。

于 2014-07-29T12:33:32.343 に答える
0

SOAP フォーマッタを使用して、モック HttpWebRequest を作成することもできます。まず、モックアップする HttpWebRequest を文字列としてキャプチャします。次に、単体テストでカスタマイズし、文字列を逆シリアル化して HttpWebRequest を再構築できます。

次に例を示します。

    static void Main(string[] args)
    {
        SoapFormatter formatter = new SoapFormatter();

        HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("http://www.google.com");
        HttpWebResponse resp = (HttpWebResponse)myReq.GetResponse();

        // save this soapRequest as a string and customize it for your mocking up
        MemoryStream target = new MemoryStream();
        using(target)
        {
            formatter.Serialize(target, resp);
        }
        string soapRequest = Encoding.UTF8.GetString(target.GetBuffer());

        // now you can use the string to reconstruct the object from the string without needing anything special (other than substituting your own values into the XML)
        HttpWebResponse myMockedObject = (HttpWebResponse)formatter.Deserialize(
            new MemoryStream(Encoding.UTF8.GetBytes(soapRequest)));
    }
于 2014-08-20T15:48:20.687 に答える
0

モック HttpResponse は次のようになります。

public SenHttpMockResponse(HttpListenerContext context)
{
   HttpListenerResponse response = context.Response;
   response.Headers.Add("Content-type", @"application/json");
   JObject message = JObject.Parse(@"{'SomeParameterName':'ParameterValue'}");
   StreamWriter writer = new StreamWriter(response.OutputStream);
   writer.Write(message);
   writer.Close();
}

デフォルトでは、この場合の応答コードは 200 ですが、次のように調整することもできますResponse.StatusCode = 400;

リクエストをモックするには、デバッガー ツールなどを使用できます。たとえば、Firefox アドオンHttpRequester は非常に優れています。あらゆるタイプのリクエストを行うことができ、レスポンスも表示されます。それは私が言う便利なものです

于 2014-07-31T09:10:51.093 に答える
0

個人的には使用していませんが、Molesフレームワークを使用すると、やりたいことを実行できるはずです。への呼び出しをインターセプトする例については、こちらを参照してくださいDateTime.Now

于 2013-04-26T20:38:52.270 に答える