静的メソッドとファクトリ(のような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...
}
}
}
}