2015-09-09 5 views
6

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

Во-первых этот вопрос включает в себя следующие объекты и их соответствующие карты:

public class DbAccount : ActiveRecordBase<DbAccount> 
{ 
    // this is the ORM entity 
} 

public class Account 
{ 
    // this is the primary full valued Dto 
} 

public class LazyAccount : Account 
{ 
    // this class as it is named doesn't load the majority of the properties of account 
} 

Mapper.CreateMap<DbAccount,Account>(); 
//There are lots of custom mappings, but I don't believe they are relevant 

Mapper.CreateMap<DbAccount,LazyAccount>(); 
//All non matched properties are ignored 

Он также включает в себя эти объекты, хотя я не сопоставлял с AutoMapper в данный момент:

public class DbParty : ActiveRecordBase<DbParty> 
{ 
    public IList<DbPartyAccountRole> PartyAccountRoles { get; set; } 
    public IList<DbAccount> Accounts {get; set;} 
} 

public class DbPartyAccountRole : ActiveRecordBase<DbPartyAccountRole> 
{ 
    public DbParty Party { get; set; } 
    public DbAccount Account { get; set; } 
} 

Эти классы преобразуются с использованием специального кода, который включает следующее: source - DbParty:

var party = new Party() 
//field to field mapping here 

foreach (var partyAccountRole in source.PartyAccountRoles) 
{ 
    var account = Mapper.Map<LazyAccount>(partyAccountRole.Account); 
    account.Party = party; 
    party.Accounts.Add(account); 
} 

Тест, с которым я столкнулся, создает новый DbParty, 2 новых DbAccounts, связанных с новым DbParty, и 2 новых DbPartyAccountRoles, связанных как с новым DbParty, так и по 1 на каждый из DbAccounts. Затем он тестирует некоторые функции обновления через репозиторий DbParty. Я могу включить некоторый код для этого, если потребуется, потребуется немного времени для очистки.

При запуске сам по себе этот тест работает нормально, но при запуске в той же сессии, как еще один тест (который я подробно ниже) Mapper вызова в приведенном выше коде преобразования выдает это исключение:

System.InvalidCastException : Unable to cast object of type '[Namespace].Account' to type '[Namespace].LazyAccount'. 

Другой тест также создает новый DbParty, но только с одним DbAccount, а затем создает 3 DbPartyAccountRoles. Я был в состоянии сузить этот тест вниз к точной линии, нарушающего другой тест, и это:

Assert.That(DbPartyAccountRole.FindAll().Count(), Is.EqualTo(3)) 

Комментируя эту строку позволяет другой тест пройти.

С этой информацией я предполагаю, что тест ломается из-за чего-то связанного с CastleProxy, который находится за объектом DbAccount при вызове AutoMapper, но у меня нет ни малейшего представления о том, как это сделать.

Теперь я смог выполнить соответствующие функциональные тесты (совершая вызовы против самой службы), и они, похоже, работают нормально, это заставляет меня думать, что установка единицы тестирования может быть фактором, наиболее примечательным является то, что тесты в вопрос выполняется в базе данных SqlLite в базе данных.

+0

Я нахожу точный тест, который создает проблему. – Phaeze

+0

Я нашел точный тест и даже точную строку внутри этого теста, и я переписал вопрос, чтобы очистить его, добавив больше контекста – Phaeze

ответ

0

Проблема в том, что проблема связана с запуском AutoMapper Bootstrapper несколько раз в модульных тестах; вызов был в методе TestFixtureSetup в нашем базовом классе тестирования.

Исправление было добавить следующую строку перед созданием карты:

Mapper.Reset(); 

Я до сих пор интересно, почему это было единственное, что карта была проблема.

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

  • Нет связанных вопросов^_^