2015-06-30 74 views
0

我有一个简单的网站,有一个页面。该功能我是单元测试是在单元测试中处理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包括

回答

3

响应对象的System.Web,这是一个重要指标的一部分,它里面运行一个Web服务器。您正在Web代码上运行“单元测试”而无需调用Web服务器。你能猜到为什么它可能会失败吗?

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

有意义吗?

+0

感谢格雷戈里,这是有道理的。在我的单元测试中,我调用的是生活在Web服务器环境中的函数,因为我不在Web服务器环境中,所以失败了。你是否建议模拟依赖关系或者使用'HttpRequest'来测试我的函数? –

+0

在大多数情况下,我使用非常薄的UI位。示例:ASP.NET页面的事件最多只有几行,实际的移动代码位于类中。但是,我不会更深入地写入流的代码,因为它非常关注用户界面。然后,根据您正在测试的内容分离测试类型。如果您正在测试Web UI,则更有可能进行集成测试。合理? –

+0

它的确如此,我想我需要一些时间来围绕它思考 –