1

我一直在为 ASP.NET MVC 中的自定义 ActionFilter 编写单元测试。

一切正常,但我的单元测试中有一个奇怪的行为。AppendHeader似乎没有修改HttpResponseBase.Headers集合。当我调试以下代码时,我的集合中只有两个项目:"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" } });

有人可以对此有所了解并解释为什么会这样吗?

如果我在我的 ActionFilter 中运行网站AppendHeader,我会得到标题。所以它通常有效,但正如我所说,我在我的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 回答