2011-01-12 85 views
7

我正在爲ASP.NET MVC控制器方法編寫單元測試。我應該在單元測試中使用AutoMapper嗎?

這些控制器對IMapper有依賴關係 - 我創建的一個接口用於抽象AutoMapper,它是使用Castle Windsor通過構造函數注入傳入的。

操作方法使用IMapper從域對象映射到ViewModel對象並再次返回,旨在保持乾淨並保持操作方法簡潔。

在我的單元測試,我

  1. 配置AutoMapper用正確的綁定(他們使用AutoMapper配置文件,所以可測試和網站和單元測試項目之間重複使用內置),並應通過在作爲適當的AutoMapper實現IMapper

  2. 傳遞模擬對象(我使用Moq)爲IMapper實例,具體取決於測試(這將意味着在測試設置代碼中複製一些工作以確保從模擬映射器返回的對象與模擬映射器假裝映射的對象)。

  3. 手動配置AutoMapper只有映射我想我需要每個測試(很多工作和手段我沒有測試將真正使用的映射)。

在單元測試中使用基礎結構代碼有什麼意見?它在什麼時候成爲集成測試(即測試AutoMapper和我的控制器的集成)?

感覺就像2是純粹的視圖,雖然我認爲我需要更多地瞭解Moq以及如何讓它返回與傳遞給它嘲笑的方法的實際值有關的值。

回答

6

我可能傾向於同意#2。你知道automapper的作品,你知道你的注射工作(得到測試的權利?:-))我會更專注於具體事情,不只是SomeClass.Property = AnotherClass.Property - 這些特殊情況應該測試不基本的複製功能。不要測試框架的東西。

至於更多的測試代碼 - 我覺得完全沒問題。對於給定的單位,測試應該在給定的測試中設置(也在合理的範圍內)。

關於Moq,語法很簡單,不要過度綁定它。 var obj = new Mock();然後設置你的屬性,如obj.Setup(x => x.Property).returns(「你好」),除非你有一個更具體的問題? Moq也設置了它的所有屬性,所以你可能甚至不需要自動映射器

-edit-發現它,它的obj.SetupAllProperties();

4

我贊成的#2像jeriley

添加到起訂量,如果需要返回基於傳遞給它的值的對象,你可以寫你的設置,像這樣:

mockObject.Setup(x => x.MapObject(It.IsAny()) 
      .Returns((ProductDto productDto) => 
      { 
       var product = new Product() 
       { 
        Id = productDto.Id, 
        Name = productDto.Name 
       }; 

       return product 
      });

有點凌亂但方便。

+0

如果您使用存儲庫模式,我可以指出您... http://rileytech.net/post/2010/08/17/Mock-Utility-creating-those-basic-services.aspx - - 使用最後兩個文件或將其用作完整示例:-) – jeriley 2011-01-12 13:23:38

相關問題