2011-01-28 8 views
3

MODIFIED:このコードでは、HttpRequest.InputStreamを使用して要求の本文を読み取り、解析して格納します。私はこのクラスを単体テストすることができるようにしたいと思いますが、私は体に何も付けることはできません。それは可能ですか?たぶん私はAクラスを直接ハックして何らかの価値を持たせることができるかもしれません。カスタム入力ストリームをHttpRequest.InputStreamに貼り付けるには?

を追加しました:ここに単純化されたデザインです。

class A 
{ 
    private string _body; 
    public string Body { get { return _body; } } 

    public A(HttpRequest r) 
    { 
    {parse r and store data, i.e. query parameter, etc. } 
    _body = {read body from r.InputStream }; 
    } 
} 

class B 
{ 
    public void ProcessRequest(HttpRequest r) 
    { 
    var c = new C(r); 
    ParseBody(c.Body); 
    } 
} 

それはすべて良いことだ、私は確かにそれはプライベートだ場合でもParseBodyをテストすることができます。しかし、私はクラスAを単体テストしており、それが問題のあるところです。私はBody R/Wプロパティを作ることができますが、それはAが不変であると思われるためにカプセル化を壊すことです。

+0

回答ありがとうございます。それらはすべて素晴らしい提案ですが、私が継承したコードは上記のように見えます。おそらく、私はInputStreamを使う必要はありませんが、何らかの理由で使用するクラスをクラックさせるかもしれません。 – Schultz9999

+0

コンストラクタを介してストリームを提供することで、すべてを内側に変え、内部の依存関係(context.HttpRequest.InputStream)を取り除きました。 – Schultz9999

答えて

1

InputStreamは標準ストリームなので、単体テストパーサーが内容を解析するようにするには、代替ストリームを渡すだけです。それはあなたがテストしているものではないので、HttpRequestからのものである必要はありません。解析が機能しているかどうかをテストしています。

これをHttpRequestと組み合わせなければならない場合は、HttpRequestBaseクラスを調べて、InputStreamを疑似させることができます。しかし、私が上で述べたように、それはストリームで取得する追加のメソッド呼び出しです。

+1

誰もが正しいので選ぶ必要があります。私はこれを受け入れるでしょう。なぜなら、jjrdkは最低の評判だからです:) – Schultz9999

+0

私はそれを感謝します。 – jjrdk

2

これを達成する最良の方法は、HttpRequest.InputStreamを直接使用しないことです。

入力ストリームを取得するサービスを作成する場合は、本番ではHttpRequest.InputStream、単体テストではカスタムストリームを返すことができます。

2

外部から試してください:ローカルのどこかでスクリプトをホストし、それをあなたが消費したいと思うどんな体でも呼びます。これは単なる単体テストではありませんが、HttpRequest.InputStreamからの読み込みを直接扱う単体テストが必要な場合は、接続部分とストリームの読み込みを分割することを検討してください。あなたは好きなストリームをストリームリーダーに送ることができます。

関連する問題