代码之家  ›  专栏  ›  技术社区  ›  TheCloudlessSky

运行测试时HttpResponseBase.Headers为空

  •  5
  • TheCloudlessSky  · 技术社区  · 14 年前

    我正在使用Moq创建一个 Mock<HttpResponseBase> 测试 FileResult 我正在为我的MVC2应用程序创建。

    WriteFile(HttpResponseBase response) 文件结果 ,我在末尾有以下代码:

    // Write the final output with specific encoding.
    response.OutputStream.Write(output, 0, output.Length);
    response.AppendHeader("Content-Encoding", encoding);
    

    它将使用 utf-8 gzip Accept-Encoding 头球。

    所以在我的测试中,我设置了 就像这样:

    var mockResponse = new Mock<HttpResponseBase>();
    mockResponse.Setup(r => r.OutputStream).Returns(new MemoryStream());
    mockResponse.Setup(r => r.Headers).Returns(new NameValueCollection());
    

    但当我真的检查了头的位置, Content-Encoding 返回空值:

    var response = mockResponse.Object;
    Assert.AreEqual("utf-8", response.Headers["Content-Encoding"]);
    

    奇怪的是OutputStream得到了写入它的数据,我可以断言它正在写入正确的值。

    奇怪的是,当我真正调试 文件结果 在web项目中,头是正确发送的。

    3 回复  |  直到 14 年前
        1
  •  4
  •   TheCloudlessSky    14 年前

    我最后只是嘲笑 AppendHeader 方法将头强制添加到 HttpResponseBase

    mockResponse
        .Setup(r => r.AppendHeader(It.IsAny<string>(), It.IsAny<string>()))
        .Callback((string k, string v) => mockResponse.Object.Headers.Add(k, v));
    

    我怀疑电话里有什么东西 附录标题 HttpResponseBase公司 到位。

        2
  •  4
  •   Igor Zevaka    14 年前

    你现在面临的问题是你试图部分地嘲笑 HttpResponseBase 上课。写入输出流可以工作,因为属性( OutputStream

    然而,当你嘲笑 Headers 属性,只有那个属性被嘲笑而不是 AppendHeader ,这就是你的SUT实际所做的。Moq创建的默认mock只是将所有方法和属性存根为返回默认值,因此 实际上什么都没做。

    有两种解决方案,第一种是纯交互测试,是我的首选方法。不要嘲笑 ,但请验证 附录标题 .

    Mock<HttpResponseBase> responseMock = new Mock<HttpResponseBase>();
    //the rest of response setup
    FileResult sut = new MyFileResult();
    sut.WriteFile(responseMock.Object);
    responseMock.Verify(response=>response.AppendHeader("Content-Encoding", "utf8"));
    

    Mock<HttpResponseBase> responseMock = new Mock<HttpResponseBase>(){ CallBase = true };
    //the rest of response setup
    FileResult sut = new MyFileResult();
    sut.WriteFile(responseMock.Object);
    Assert.AreEqual("utf-8", responseMock.Object.Headers["Content-Encoding"]);
    

    在测试与框架的交互时,我希望第一个版本能有很小的优势。第二个版本更多的是基于状态的测试,所以理论上你甚至不需要模拟,你可以只使用实际的类。万一 HttpResponseBase公司

        3
  •  2
  •   Ahmad    14 年前

    基于所提供的设置代码(不确定是否是输入错误),我认为应该如下所示

    var Response = new Mock<HttpResponseBase>();
    Response.Setup(r => r.OutputStream).Returns(new MemoryStream()); 
    Response.Setup(r => r.Headers).Returns(new NameValueCollection());