当我IReadOnlyList在我的代码中实现时,我的单元测试抛出了一个AutoMapperMappingException.
从挖掘文章和文档,我的猜测是AutoMapper需要特殊的readonly类型编码.这会是什么样的?
注意:我尝试Mapper.AssertConfigurationIsValid();了另一篇文章建议,但没有改进.
测试名称:CreateOrder_ValidContract_CreatesNewOrder测试FullName:ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder测试源:C:\ Users\me\documents\visual studio 2015\Projects\ACME.Maintenance\ACME.Maintenance.Domain.Test\OrderServiceTest. cs:第65行测试结果:测试持续时间失败:0:00:00.0233941
结果StackTrace:位于C:\ Users\me\documents\visual studio 2015\Projects\ACME.Maintenance\ACME中ACME.Maintenance.Domain.ContractService.GetById(String contractId)的lambda_method(Closure,ContractDto,Contract,ResolutionContext). Maintenance.Domain\ContractService.cs:位于C:\ Users\me\documents\visual studio 2015\Projects\ACME.Maintenance\ACME.Maintenance.Domain中的ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder()的第34行. Test\OrderServiceTest.cs:第69行结果消息:测试方法ACME.Maintenance.Domain.Test.OrderServiceTest.CreateOrder_ValidContract_CreatesNewOrder引发异常:AutoMapper.AutoMapperMappingException:缺少类型映射配置或不支持的映射.
映射类型:ContractDto - > Contract
ACME.Maintenance.Domain.DTO.ContractDto - > ACME.Maintenance.Domain.Contract
Mapper.Initialize(cfg => cfg.CreateMap<ContractDto, Contract>());
Mapper.Initialize(cfg => cfg.CreateMap<PartDto, Part>());
[TestMethod]
public void CreateOrder_ValidContract_CreatesNewOrder()
{
//Arrange
var orderService = new OrderService();
var contractService = new ContractService(_contractRepository);
var contract = contractService.GetById(ValidContractId);
// Act
var newOrder = orderService.CreateOrder(contract);
// Assert
Assert.IsInstanceOfType(newOrder, typeof(Order));
Guid guidOut;
Assert.IsTrue(Guid.TryParse(newOrder.OrderId, out guidOut));
Assert.AreEqual(newOrder.Status, ContractStatus.New);
Assert.IsInstanceOfType(newOrder.Items, typeof(IReadOnlyList<OrderItem>));
}
Run Code Online (Sandbox Code Playgroud)
ContractService类:
public Contract GetById(string contractId)
{
var contractDto = _contractRepository.GetById(contractId);
var contract = Mapper.Map<ContractDto, Contract>(contractDto);
Mapper.AssertConfigurationIsValid();
return contract;
}
Run Code Online (Sandbox Code Playgroud)
合同类:
public class Contract
{
public string ContractId { get; set; }
public DateTime ExpirationDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
ContractDto类:
public class ContractDto
{
public string ContractId { get; set; }
public DateTime ExpirationDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
你的问题是,你在呼唤Mapping.Initialize多次:它不是添加剂,所以你覆盖以前的映射,这就是为什么你失去的地图ContractDto来Contract
所以在Setup你的测试方法中,你应该像这样调用它:
Mapper.Initialize(cfg => {
cfg.CreateMap<ContractDto, Contract>();
cfg.CreateMap<PartDto, Part>();
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3129 次 |
| 最近记录: |