我正在努力在我们的服务中实现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,两个与新的DbParty链接的新DbAccounts,以及两个与新的DbParty链接的2个新的DbPartyAccountRoles,以及每个与每个DbAccounts链接的两个。
然后,它通过DbParty存储库测试某些更新功能。如果需要,我可以为此添加一些代码,这将花费一些时间进行清理。

单独运行时,此测试运行良好,但与另一个测试在同一 session 中运行(我将在下面详细介绍)时,上述转换代码中的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))

注释掉该行允许其他测试通过。

有了这些信息,我的猜测是测试失败是因为调用AutoMapper时与DbAccount对象后面的CaSTLeProxy有关,但我对此一无所知。

现在,我已经设法运行了相关的功能测试(针对服务本身进行了调用),并且它们似乎运行良好,这使我认为单元测试设置可能是一个因素,最值得注意的是所针对的测试是针对内存数据库中的SqlLite。

最佳答案

问题最终与在单元测试中多次运行AutoMapper Bootstrapper有关。调用是在我们的测试基类的TestFixtureSetup方法中进行的。

解决方法是在创建 map 之前添加以下行:

Mapper.Reset();

我仍然对为什么这是唯一有问题的 map 感到好奇。

关于c# - 请求子类时如何阻止Automapper映射到父类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32489127/

10-10 16:50