1

ASP.NET MVC でカスタム ActionFilter の単体テストを書いているところです。

すべて正常に動作しますが、単体テストで奇妙な動作が発生しています。コレクションAppendHeaderを変更しないようです。HttpResponseBase.Headers次のコードをデバッグすると、コレクションには と の 2 つのアイテムしかありませ"A""C"

var responseStub = new Moq.Mock<HttpResponseBase>();
responseStub.Setup(r => r.Headers)
    .Returns(new WebHeaderCollection { { "A", "A" } });

var response = responseStub.Object;

response.AppendHeader("B", "B");
response.Headers.Add(new NameValueCollection { { "C", "C" } });

誰かがこれに光を当てて、なぜこれがそのように振る舞うかを説明できますか?

AppendHeaderActionFilter を使用して Web サイトを実行すると、ヘッダーが取得されます。したがって、通常は機能しますが、前述したように、HttpResponseBase.Headersテスト用のコレクションにはありません。

4

1 に答える 1

3

HttpResponseBase.AppendHeader呼び出そうとしているメソッドの実装を見ると、このメソッドが何もしないことは驚くことではありません。

public virtual void AppendHeader(string name, string value)
{
    throw new NotImplementedException();
}

このメソッドに何かをさせたい場合は、その期待値を定義する必要があります:

// arrange
var responseStub = new Moq.Mock<HttpResponseBase>();
responseStub.Setup(r => r.Headers)
    .Returns(new WebHeaderCollection { { "A", "A" } });
var response = responseStub.Object;
responseStub
    .Setup(r => r.AppendHeader(It.IsAny<string>(), It.IsAny<string>()))
    .Callback<string, string>((name, value) => response.Headers.Add(new NameValueCollection { { name, value } }));

// act
response.AppendHeader("B", "B");

// assert
Assert.AreEqual(2, response.Headers.Count);
于 2012-07-19T05:32:47.847 に答える