在单元测试中处理HttpResponse

时间:2015-06-30 17:29:41

标签: c# asp.net unit-testing webforms httpresponse

我有一个简单的网站,有一页。我单元测试的功能是

public void WriteFileToClient(string fileContent, string fileName)
        {
            StringWriter stringWriter = new StringWriter();
            stringWriter.Write(fileContent);
            Response.ContentType = "text/plain";
            Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.txt", fileName));
            Response.Clear();

            using (StreamWriter writer = new StreamWriter(Response.OutputStream, Encoding.UTF8))
            {
                writer.Write(stringWriter.ToString());
            }
            Response.End();
        }

当我运行测试时,它表示Response不可用enter image description here

这是我的单元测试

[TestMethod]
        [TestCategory("Unit")]
        public void WriteFileToClient_ShouldSucceedForCorrectInput()
        {
            //Arrange
            Migrate migrate = new Migrate();
            Guid g = Guid.Parse("fffe49c1-a838-46bc-b5c6-4e0bbd3e4c32");

            string fileContent = migrate.GenerateFlatFileText(g);
            string fileName = string.Format("flat file - {0}.txt", g);

            //Ask
            migrate.WriteFileToClient(fileContent, fileName);

            //Assert
            migrate.Response.OutputStream.Should().NotBeNull();
            migrate.Response.ContentType.Should().Be("text/plain");
            migrate.Response.Headers.Should().HaveCount(1);
        }

有关如何模拟响应的任何建议?老实说,我不明白为什么Response对象不可用,我的Migrate类会继承Page而我的理解应该包含Response

1 个答案:

答案 0 :(得分:3)

Response对象是System.Web的一部分,它是在Web服务器中运行的强大指示器。您正在Web代码上运行“单元测试”而不调用Web服务器。你能猜出它为什么会失败吗?

如果有的话,用户界面通常不会轻易进行单元测试。一个例外是MVC中的控制器,但是控制器必须与依赖关系隔离,以进行单元测试,而不是“它是否调用了正确的视图”。当您开始处理响应流等测试时,您需要在Web服务器的上下文中调出代码。这意味着必须使用HTTP请求测试具有Response的实际代码,然后检查响应。除了模拟依赖项之外,这更像是集成测试,而不是单元测试。

有意义吗?