我目前正在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
}
}
}
在您當前的控制器測試中,您如何處理映射?你在嘲笑它,還是真的在調用它?如果實際調用它,那麼當映射出現問題時,現有的控制器測試應該會失敗。本質上,ViewModel進來,模型去依賴關係,它在回來的路上反轉。如果*任何*映射失敗,您現有的交互應該失敗... – forsvarir
嘲笑它。在我粘貼的代碼中,我添加了另一個(不完整的,也許不合適的)測試來調用真實的東西。 –