2017-03-08 15 views
1

ASP.NETでは、私はHttpRequestオブジェクトを使って単体テストを模擬しようとしています。オブジェクトのFormコレクションは、コレクションが読み取り専用であることを示しています。独自のhttprequest実装を提供することなく、単体テストに対してこの動作を実装する方法はありますか?次のスニペットは、request.Formが読み取り専用で失敗します。 Tx。ユニットテストのためのHttpRequest.Formの模擬

var request = new HttpRequest("", "http://localhost" + url, ""); 
request.Form["__EVENTTARGET"] = eventTarget; 
AutorefreshSessionHelper.IsRequestForAutoRefresh(request); 

答えて

2

このスニペットを使用すると、フォームコレクションに書き込んだり、再び無効にすることができます。 ASP.NET 3.5でテストされています。

var request = new HttpRequest("", url, ""); 
var formType = request.Form.GetType(); 
formType.GetMethod("MakeReadWrite", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(request.Form, null); 

request.Form["__EVENTTARGET"] = eventTarget; 

formType.GetMethod("MakeReadOnly", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(request.Form, null); 
0

私は、単体テストの場合、オブジェクトの可視性によって課せられた保護の一部をバイパスすることが大事です。

したがって、HttpRequestの "Form"プロパティは保護されたIsReadOnlyプロパティを持つNameValueCollection型です。ここでリフレクションが役立ちます:

var pi = typeof(NameObjectCollectionBase).GetProperty("IsReadOnly", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
pi.SetValue(request.Form, false); 
0

これは基本的にASP.netをテストしようとしているため、これは単体テストにはなりません。 ASP.netにはインターフェイスがないので、あなたが模擬できるクラスはあまりありません。

私はフォームの内容を受け入れるテストしたいメソッドの下にあると思います。私はそれを試してみることをお勧めします。

関連する問題