2016-02-29 116 views
2

我目前正在MVC項目中使用映射框架(automapper-like)。查看模型到域模型,在哪裏測試映射?

在我的控制器中,我使用框架的擴展方法「Map」將視圖模型映射到域模型(看起來像是合法的位置)。

當然,如果映射中斷(例如,如果某些屬性名稱更改並導致不匹配),我的代碼將無法工作。

但是在哪裏按預期測試映射工作?

控制器不是對此負責的「單位」。視圖模型和域模型都不是。我覺得雖然我可以創建自己的包裝(Ioc可注入實例),並使用視圖模型到域模型的映射來測試它,但它感覺有點尷尬(代碼讀者如何知道需要對特定類執行的測試?)。

我有點失落。

編輯:(約翰三菱商事的答案反射)

using System; 
using NSubstitute; 
using Models = TestEncodeLines.Models; 
using Controllers = TestEncodeLines.Controllers; 
using ViewModels = TestEncodeLines.ViewModels; 
using Infrastructure = TestEncodeLines.Infrastructure; 
using Xunit; 

namespace Tests.TestControllers 
{ 
    public class TestActivityController 
    { 
     private Controllers.ActivityController _controller; 

     public TestActivityController() 
     { 
      _controller = new Controllers.ActivityController(); 
     } 

     [Fact] 
     public void Save_Project() 
     { 
      // Arrange 
      var viewModel = new ViewModels.ActivitiesViewModel(); 
      var model = Substitute.For<Models.IActivitiesModel>(); 
      var mapper = 
       Substitute.For<Infrastructure.IMapper<ViewModels.ActivitiesViewModel, Models.IActivitiesModel>>(); 
      mapper.Map(viewModel).Returns(model); 

      // Act 
      _controller.SaveActivities(viewModel); 

      // Assert 
      model.Received().Save(); 
     } 

     [Fact] 
     public void Save_Project_TestMapping /* Here ??? */() 
     { 
      // Arrange 
      var viewModel = new ViewModels.ActivitiesViewModel 
      { 
       Activities = new[] 
       { 
        new ViewModels.ActivitiesViewModel.Project 
        { 
         From = new DateTime(2016, 02, 23, 8, 0, 0, DateTimeKind.Utc), 
         To = new DateTime(2016, 02, 23, 10, 0, 0, DateTimeKind.Utc), 
         Name = "Test" 
        } 
       }, 
       Date = new DateTime(2016, 02, 23, 0, 0, 0, DateTimeKind.Utc) 
      }; 
      var mapper = new Infrastructure.Mapper<ViewModels.ActivitiesViewModel, Models.IActivitiesModel>(); 

      // Act 
      _controller.SaveActivities(viewModel); 

      // Assert 
      // Somehow (https://github.com/jamesfoster/DeepEqual ??) check the mapping 
     } 
    } 
} 
+1

在您當前的控制器測試中,您如何處理映射?你在嘲笑它,還是真的在調用它?如果實際調用它,那麼當映射出現問題時,現有的控制器測試應該會失敗。本質上,ViewModel進來,模型去依賴關係,它在回來的路上反轉。如果*任何*映射失敗,您現有的交互應該失敗... – forsvarir

+0

嘲笑它。在我粘貼的代碼中,我添加了另一個(不完整的,也許不合適的)測試來調用真實的東西。 –

回答

1

我抽象的實施映射框架IMappingService這是通過構造函數注入。然後您可以確保在控制器單元測試中正在對映射框架進行所需的調用。

至於測試映射,Automapper有一個配置選項,這將確保您的配置的映射配置文件將不會翻倒:

AutoMapper.AssertConfigurationIsValid() 

這並不是說,映射正確不過。

難道你不只是創建映射特定的單元測試,只關注映射部分?爲什麼不實例化你的源對象,並嘗試將它映射到單元測試中的目標,並在那裏聲明它們的正確性?

+0

您是否建議我在添加到我的問題中的(第二測試)代碼中執行操作? –

+0

我會爲每個映射配置文件創建一個專用的單元測試類。您正在測試映射,而不是控制器的功能 –