2009-11-06 16 views
7

私はずっとASP.NETで何とかHttpContextを偽装/嘲笑/スタブしています(ASP.NET MVC/MonoRailでははるかに簡単です)。なぜHttpContextを構築できるのか疑問に思うのですか?

しかし、私はHttpContext自体が文字通り2行のコードで簡単に構築できることがわかります。

var tw = new StringWriter(); 
var workerReq = new SimpleWorkerRequest("/webapp", @"c:\here\there\wwwroot", "page.aspx", tw); 
var context = new HtpContext(workerReq); 

我々はこのような何かにこのコードをラップします場合は、それが正常に動作する必要があり、おそらく私たちもいることを使用してASPXをレンダリングすることができます

using(Simulate.HttpContext()) { 
    HttpContext.Current.BlaBla; 
} 

だから質問は次のとおりです。

  1. なぜそれをしてはならないのか。
  2. なぜそれを行うべきなのか。
  3. なぜ広く使われていないのですか(実際には、私はそれについての投稿は何も思い出せません)。

Phill HaackがReflectionハックを使用してHttpContextを構築した1つの投稿を覚えています。
しかし、それはちょうど必要ではないようです。

乾杯、
ドミトリー。

答えて

5

非常に簡単なテストを行っても問題ありませんが、HttpRequest.Filesを使用するコンポーネントを単体テストする方法はありますか?私が知る限り、SimpleWorkerRequestでこれを指定できる公開APIはありません。 HttpFileCollectionプロパティを設定できる場所が見つかったとしても、そのコンストラクタは内部的なものであるため、その型のインスタンスを作成することさえできません。

HttpRequest.Filesこの点だけではなく、実際にはあなたよりも、現在のHttpContext実装とあなたができないテストテストすることができ非常に多くのものは、おそらくあります。これは、抽象概念が本当に便利になる場所です。働くかもしれない

2

考慮すべきシナリオがいくつかあります。

シナリオ1:ユニットテストです。キャッシュへのアクセスを管理し、HttpContent.Cacheを明示的に呼び出すクラスのような小さなものがあります。この場合、どのような呼び出しが行われているか、そして期待どおりに動作しているかどうかを確認できるようにコンテキストをモックしてください。

シナリオ2:複雑なページの生成のような大きなものをテストしようとしている統合テストを行っています。この場合、実際のHttpContentオブジェクトにあなたが見つけた方法を与えます。統合テストは、実際のランタイムをよりよくシミュレートします。

+0

また、特定のエラー状態にアクセスするためのモッキングも優れています。 – dbn

0

、しかし...

  • まず私は、環境に異なる場合がありますいくつかのパスを参照してください。
  • 2番目にIISがインストールされている必要がありますか?
  • 作成にどれくらいの時間がかかりますか? 100回のテストが必要で、1秒かかる場合は、テストが1分以上実行され、テストを実行している開発者が少なくなることを意味します。
  • テストシナリオを作成するためのキャッシュやリクエストなどを簡単に模擬/設定できますか?

おそらくモッキング/スタブが簡単です。

EDIT

発見のためのいくつかのソースコードのHttpContextとMonoプロジェクトでSimpleWorkerRequest:それらは創造で何が起こっているのか、より良い洞察力を与えることができ

ASP.NET CreateApplicationHost/SimpleWorkerRequest API Hole

実際に、我々はそれらを適用する前に、それらのオブジェクトに何が起こっているかを理解する必要があり、それには時間がかかることをうまく説明:

も同様に役立つかもしれない何記事を見つけました。黙っているほうが簡単です。

+0

PATHS:私は彼らが実際に使用されているとは思わない。 IIS:それも必要とは思わない。作成する時間:複雑なオブジェクトより長くてはならないと思います。しかし最後のポイント(モックアップキャッシュ/リクエスト)は良いものです。 –

関連する問題