2015-06-30 71 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

它的確如此,我想我需要一些時間來圍繞它思考 –