Я работаю над внедрением 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 в базе данных.
Я нахожу точный тест, который создает проблему. – Phaeze
Я нашел точный тест и даже точную строку внутри этого теста, и я переписал вопрос, чтобы очистить его, добавив больше контекста – Phaeze