3

テストケースでネットワーク障害などをシミュレートするために、Moqでリクエストオブジェクトをモックしてみたかったのです。私の最初の試みは:

        var mock = new Mock<WebRequest>();
        mock.Setup(m => m.GetResponse()).Throws<WebException>();
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        //trying to get this to throw a web exception
        request.GetResponse();

これは機能していないので、これを行う正しい方法を探しています。

ありがとう

編集:コメントで指摘されているように、WebRequest.Createを使用したいと思います(実際には別のメソッドにありますが、例のために簡略化しています)。

4

1 に答える 1

9

静的メソッドとファクトリ(のようなWebRequest.Create)は、単体テストの苦痛です。そのようなファクトリメソッドの中には、結果をインターセプト/カスタマイズできるものもあれば、そうでないものもあります。

最も簡単な解決策は、コードが依存する独自のファクトリメソッド(できればインターフェイスの形式)を用意することです。

場合によっては、コードに独自のオブジェクトを作成させる代わりに、作成済みのオブジェクトをテスト対象のコードに渡すことができます。

特に、WebRequest.RegisterPrefixWebRequest.Createを介して独自のファクトリを提供できる場合があります。説明を見ると、「http」/「https」はすでに登録されており、重複登録は許可されていないため、他のカスタムURIスキームを使用する必要があります(このアプローチを試したこともありません)。

これは、コンソールアプリケーションの「http://」スキームのカスタムクリエーターを提供するサンプルコードです。他の何かがすでにhttpスキームを登録している場合、このコードはおそらく失敗しますWebRequest

using System;
using System.Net;
namespace CustomWebRequest
{
    class Program
    {
        static void Main(string[] args)
        {
            var success = WebRequest.RegisterPrefix("http://", new CustomRequestCreator());
            Console.Write("Handler registered:{0}", success);

            var request = WebRequest.Create(new Uri("http://home.com"));
        }

        class CustomRequestCreator : IWebRequestCreate
        {
            public WebRequest Create(Uri uri)
            {
                Console.WriteLine("Custom creator");
                return null; // return your mock here...
            }
        }
    }
}
于 2013-03-04T02:38:06.530 に答える