Я получал эту же ошибку при тестировании коллекции, сохраненной с помощью nHibernate. Я смог заставить это работать, переопределив оба метода Equals и GetHashCode . Если я не переопределил оба, я все еще получил ту же ошибку, которую вы упомянули:
CollectionAssert.AreEquivalent failed. The expected collection contains 1 occurrence(s) of .
The actual collection contains 0 occurrence(s).
У меня был следующий объект:
public class EVProjectLedger
{
public virtual long Id { get; protected set; }
public virtual string ProjId { get; set; }
public virtual string Ledger { get; set; }
public virtual AccountRule AccountRule { get; set; }
public virtual int AccountLength { get; set; }
public virtual string AccountSubstrMethod { get; set; }
private Iesi.Collections.Generic.ISet<Contract> myContracts = new HashedSet<Contract>();
public virtual Iesi.Collections.Generic.ISet<Contract> Contracts
{
get { return myContracts; }
set { myContracts = value; }
}
public override bool Equals(object obj)
{
EVProjectLedger evProjectLedger = (EVProjectLedger)obj;
return ProjId == evProjectLedger.ProjId && Ledger == evProjectLedger.Ledger;
}
public override int GetHashCode()
{
return new { ProjId, Ledger }.GetHashCode();
}
}
Что я тестировал, используя следующее:
using (ITransaction tx = session.BeginTransaction())
{
var evProject = session.Get<EVProject>("C0G");
CollectionAssert.AreEquivalent(TestData._evProjectLedgers.ToList(), evProject.EVProjectLedgers.ToList());
tx.Commit();
}
Я использую nHibernate, который поощряет переопределение этих методов в любом случае. Единственный недостаток, который я вижу, состоит в том, что мой метод Equals основан на бизнес-ключе объекта и поэтому проверяет равенство, используя бизнес-ключ и никакие другие поля. Вы можете переопределить Equals так, как хотите, но остерегайтесь загрязнения равенства, упомянутого в этом посте:
CollectionAssert.AreEquivalent fail ... не могу понять, почему