1

Request.InputStream から POST 本文を読み取る WebApi コントローラーの単体テストを作成しています。HttpContext.Current.Request.InputStream の入力ストリーム プロパティを設定するか、入力ストリームの内容を設定する必要があります。これまでの単体テスト コードは次のとおりですが、例外がスローされ続けます。

var originalStream = HttpContext.Current.Request.InputStream;
Stream newStream = new MemoryStream(ASCIIEncoding.Default.GetBytes("Test String"));

var propInfo = originalStream.GetType().GetProperty("CanWrite");
propInfo.SetValue(originalStream, true);

newStream.CopyTo(originalStream);

propInfo.SetValue(originalStream, false);

SetValue 行で次の例外が発生します。

ArgumentException: Property set method not found

私はこれについてすべて間違っていますか?コントローラーは入力ストリームを読み取り、それを JSON に逆シリアル化するため、そのストリームにデータを挿入できる必要があります。私はそれを行う方法がわかりません。どうもありがとう。

4

2 に答える 2

2

public abstract bool CanWrite { get; }. そのプロパティにはセッターがありません..したがって、エラーです。

あなたの例でoriginalStreamは、タイプになりStreamます。テスト用に別のストリームにラップします。をテストしているのではなくHttpRequest.InputStream、デシリアライゼーションをテストしています...

var originalStream = new StreamReader(HttpContext.Current.Request.InputStream);
var content = originalStream.ReadToEnd();

...など

実際にテストしていないため、リクエスト入力を完全にスキップすることを検討することもできます。

編集:

もう少し拡大します。これをコントローラ アクションの外に移動する必要があります。次のようにします。

public class YourController : Controller {
    private readonly IStreamWrapper _streamWrapper;

    public YourController(IStreamWrapper wrapper) {
        _streamWrapper = wrapper;
    }

    public ActionResult MethodYouAreTesting() {
        var result = _streamWrapper.Process(HttpRequest.InputStream);
    }
}

public class Tests {
    public void YourTestMethod() {
        var controller = new YourController(new FakeStreamWrapper()); // mock perhaps?
        // Asserts here for the controller action
    }

    public void YourWrapperTester() {
        var wrapper = new RealStreamWrapper();
        // test Process method here..
    }
}

次に、ストリームの読み取りと逆シリアル化を個別にテストできます。

それは理にかなっていますか、それとも私はそれをより複雑にしましたか? :/

于 2013-02-06T23:46:13.447 に答える
0

InputStream は読み取り専用ストリームです。

いくつかの方法があります。最も簡単な方法から始めます。

StreamReader のインスタンスを作成し、InputStream で ReadToEnd() を呼び出して、送信されるデータを取得します。

コンテンツを取得したら、JSON 変換を行う前に、必要に応じて変更できます。

繰り返しますが、これはやりたいことを行うための最も単純で、最も洗練されていない方法ですが、うまくいくはずです。

于 2013-02-06T23:46:45.840 に答える