我在单元测试中使用automapper遇到了问题。我注入了映射引擎,在代码中可以正常运行,但在测试中无法正常工作。以下是我的测试设置和测试代码。我使用Moq来模拟映射引擎。
private static IDbContext Context { get; set; }
private static Mock<IMappingEngine> Mapper { get; set; }
private static Guid MenuId { get; set; }
private static Guid menuItem1Id { get; set; }
private static Guid menuItem2Id { get; set; }
private static Guid menuItem3Id { get; set; }
[ClassInitialize]
public static void SetUp(TestContext context)
{
MenuId = Guid.NewGuid();
Context = new TestDbContext();
menuItem1Id = Guid.NewGuid();
menuItem2Id = Guid.NewGuid();
menuItem3Id = Guid.NewGuid();
var contentPage1 = new ContentPage { Id = Guid.NewGuid(), ActionName = "ActionName1", ControllerName = "ControllerName1", MenuItemId = menuItem1Id };
var contentPage2 = new ContentPage { Id = Guid.NewGuid(), ActionName = "ActionName2", ControllerName = "ControllerName2", MenuItemId = menuItem2Id };
var contentPage3 = new ContentPage { Id = Guid.NewGuid(), ActionName = "ActionName3", ControllerName = "ControllerName3", MenuItemId = menuItem3Id };
var menuItem1 = new MenuItem { Id = menuItem1Id, MenuId = MenuId, DisplayName = "MenuItem1", ExternalUrl = null, Target = Target._self, Active = true, ContentPage = contentPage1 };
var menuItem2 = new MenuItem { Id = menuItem1Id, MenuId = MenuId, DisplayName = "MenuItem2", ExternalUrl = null, Target = Target._self, Active = true, ContentPage = contentPage2 };
var menuItem3 = new MenuItem { Id = menuItem1Id, MenuId = MenuId, DisplayName = "MenuItem3", ExternalUrl = null, Target = Target._self, Active = true, ContentPage = contentPage3 };
var menu = new Models.Menu { Id = MenuId, Name = "TestMenu", SiteId = Guid.NewGuid(), MenuItems = new List<MenuItem> { menuItem1, menuItem2, menuItem3 } };
Context.Menus.Add(menu);
Context.MenuItems.Add(menuItem1);
Context.MenuItems.Add(menuItem2);
Context.MenuItems.Add(menuItem3);
var menuItemQueryResult = new List<MenuItemQueryResult>
{
new MenuItemQueryResult { Id = menuItem1Id, DisplayName = "MenuItem1", ExternalUrl = null, Target = Target._self, Active = true, ActionName = "ActionName1", ControllerName = "ControllerName1" },
new MenuItemQueryResult { Id = menuItem1Id, DisplayName = "MenuItem2", ExternalUrl = null, Target = Target._self, Active = true, ActionName = "ActionName2", ControllerName = "ControllerName2" },
new MenuItemQueryResult { Id = menuItem1Id, DisplayName = "MenuItem3", ExternalUrl = null, Target = Target._self, Active = true, ActionName = "ActionName3", ControllerName = "ControllerName3" }
};
Mapper = new Mock<IMappingEngine>();
Mapper.Setup(m => m.Map<IEnumerable<MenuItem>, IEnumerable<MenuItemQueryResult>>(It.IsAny<IEnumerable<MenuItem>>()))
.Returns(menuItemQueryResult);
}
[TestMethod]
public void Retrieve_RequestMenu_QueryResultReturned()
{
var handler = new MenuQueryHandler(Context, Mapper.Object);
var query = new MenuQuery("TestMenu");
var result = handler.Retrieve(query);
Assert.IsNotNull(result);
Assert.IsInstanceOfType(result, typeof(MenuQueryResult));
var item = result.FirstOrDefault(r => r.Id == menuItem1Id);
Assert.IsNotNull(item);
}
我现在正在测试的内容如下:
public class MenuQueryHandler : IQueryHandler<MenuQuery, MenuQueryResult>
{
private IDbContext Context { get; set; }
private IMappingEngine Mapper { get; set; }
public MenuQueryHandler(IDbContext context, IMappingEngine mapper)
{
Context = context;
Mapper = mapper;
}
public MenuQueryResult Retrieve(MenuQuery query)
{
Ensure.Argument.Is(query != null);
Ensure.Argument.IsNot(query.MenuName == string.Empty);
// Create the view model query result
var result = new List<MenuItemQueryResult>();
// Pull the required item from the cont.ext
var menuItems = Context.MenuItems.Include(m => m.ContentPage).ToList();
Mapper.Map(menuItems, result);
return new MenuQueryResult(result);
}
}
测试运行了,但映射从未发生。