別の方法は、IWebRequestCreateメソッドをコンストラクターに渡すことです。
public HTTPRequestFactory(IWebRequestCreate create)
{
_IWebRequestCreate = create;
}
public HTTPRequestFactory()
{
//Do nothing this is the real constructor, above is just for testing.
}
public WebRequest Create(String uri)
{
Uri _uri = new Uri("http://"+this.address+uri);
request = (HttpWebRequest)this.Create(_uri);
return request;
}
public WebRequest Create(Uri uri)
if (null == _IWebRequestCreate)
{
//use the real one
request = WebRequest.Create(uri);
}
else
{
//testing so use test one
request = _IWebRequestCreate.Create(uri);
}
return request;
}
次に、標準テストを使用して、希望どおりに呼び出されることを確認できます。
[Test]
public void NewwebrequestCreatesWebRequest()
{
var mockCreate = new Mock<IWebRequestCreate>();
mockCreate.Setup(x => x.Create(It.IsAny<Uri>()));
HTTPRequestFactory webrequest = new HTTPRequestFactory(mockCreate.Object);
HttpWebRequest request = (HttpWebRequest)webrequest.Create(testURI);
mockCreate.VerifyAll();
}
[Test]
public void webrequestUsesAddressProperty()
{
var mockCreate = new Mock<IWebRequestCreate>();
string IP = "10.99.99.99";
Uri expected = new Uri("http://10.99.99.99/services");
mockCreate.Setup(x => x.Create(expected));
HTTPRequestFactory webrequest = new HTTPRequestFactory(mockCreate.Object);
webrequest.address = IP;
HttpWebRequest request = (HttpWebRequest)webrequest.Create(testURI);
mockCreate.VerifyAll();
}
2つのCreate関数の理由は、文字列Create(string)を渡したいためであり、IWebRequestCreateにはCreate(Uri)が必要です。
標準の依存関係インジェクションはIWebRequestCreateでは機能しないため編集されました。標準パターンは、インターフェイスを使用してオブジェクトをインスタンス化し、コンストラクターを介して渡します。WebRequestはコンストラクターで作成できず、インターフェースをインスタンス化できないため、上記のロジックはそれを回避します。