2013-04-22 3 views
7

Я просматриваю свои автомастеры с помощью одного большого класса AutoMapperConfiguration для использования фактических профилей. Global теперь выглядит так (простите открывающуюся/закрывающуюся нарушение сейчас)Профили автомоделирования и модульные тесты

Mapper.Initialize(x => 
         { 
          x.AddProfile<ABCMappingProfile>(); 
          x.AddProfile<XYZMappingProfile>(); 
          // etc., etc. 
        }); 

Ключевой часть, которая получила меня над верхними и препятствием, которое было ранее всегда останавливал меня с использованием профилей были обязательным мой Ninject. Я никогда не смогу получить привязку к работе. До меня было такое связывание:

Bind<IMappingEngine>().ToConstant(Mapper.Engine).InSingletonScope(); 

Я с тех пор мигрировали в эту привязку:

Bind<IMappingEngine>().ToMethod(context => Mapper.Engine); 

Это теперь работает, приложение является функциональным, у меня есть профили, и все хорошо.

Захват теперь в моих модульных тестах. Используя NUnit, я бы установил зависимости конструктора.

private readonly IMappingEngine _mappingEngine = Mapper.Engine; 

, а затем в моей [Setup] метод, который я бы построить мой контроллер MVC и вызвать класс AutoMapperConfiguration.

[SetUp] 
public void Setup() 
{ 
    _apiController = new ApiController(_mappingEngine); 
    AutoMapperConfiguration.Configure(); 
} 

, который я сейчас модифицировал.

[SetUp] 
public void Setup() 
{ 
    _apiController = new ApiController(_mappingEngine); 

    Mapper.Initialize(x => 
          { 
           x.AddProfile<ABCMappingProfile>(); 
           x.AddProfile<XYZMappingProfile>(); 
           // etc., etc. 
          }); 
} 

К сожалению, это не работает. Кажется, что сопоставления не отображаются, поскольку, когда я ударяю метод, который использует сопоставления, AutoMapper выдает исключение, указывающее, что отображение не существует. Любые предложения о том, как/что изменить определение/инъекцию картографа в тесте, чтобы решить эту проблему? Я предполагаю, что определение поля IMappingEngine - это моя проблема, но не знаю, какие у меня варианты.

Благодаря

ответ

3

Issue, что у вас есть это результат использования статического Mapper.Engine, который является своего рода одноплодной, который содержит конфигурацию для AutoMapper. По соглашению, Mapper.Engine не следует изменять после того, как он был настроен. Итак, если вы хотите настроить Automapper, указав AutoMapper.Profiler для каждого из unittest, вам следует избегать его использования.

Изменения довольно просты: добавьте к вашему классу AutoMapperConfiguration его собственный экземпляр AutoMapper.MappingEngine вместо использования глобального статического Mapper.Engine.

public class AutoMapperConfiguration 
{ 
    private volatile bool _isMappinginitialized; 
    // now AutoMapperConfiguration contains its own engine instance 
    private MappingEngine _mappingEngine; 

    private void Configure() 
    { 
     var configStore = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()); 

     configStore.AddProfile(new ABCMappingProfile()); 
     configStore.AddProfile(new XYZMappingProfile()); 

     _mappingEngine = new MappingEngine(configStore); 

     _isMappinginitialized = true; 
    } 

    /* other methods */ 
} 

пс: full sample is here

+0

К сожалению, я не получил обратно к вам еще. Я проверил тест, и ваш Git работает, но как только я попытаюсь вытащить двигатель как параметр конструктора, все сходит с рельсов. Я собираюсь вернуться сегодня вечером для дальнейшего тестирования. – Khepri

+0

Я сегодня утром подтвердил, что как самостоятельное решение, ваш git делает то, что вы ожидаете. Однако для моего сценария, когда я пытаюсь передать экземпляр IMappingEngine в качестве параметра конструктора с использованием Ninject, я все еще не получаю инициализированные сопоставления. Я взял git и добавил метод, чтобы вернуть инициализированный MappingEngine и попытался передать это как параметр конструктора. Результаты были одинаковыми. – Khepri

+0

Вы пытались заменить _all_ calls/refences на «Mapper» («Mapper.Initialize',« Mapper.Engine' и т. Д.) С новым автономным экземпляром «MappingEngine»? – Akim

Смежные вопросы