Assert.AreEqual échoue alors qu'il ne devrait pas
J'ai vraiment un comportement bizarre que je ne peux pas expliquer.
J'ai la classe suivante:
public class Project
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
Et une méthode qui renvoie une Project
objet:
public Project GetByName(string Name)
{
using (ISession session = NHibernateHelper.OpenSession())
{
Project project = session.CreateCriteria(typeof(Project))
.Add(Restrictions.Eq("Name", Name))
.UniqueResult<Project>();
return project;
}
}
J'ai ajouté une Unité de Test pour tester le GetByName
méthode:
[TestMethod]
public void TestGetByName()
{
IProjectsRepository projectRepository = new ProjectsRepository();
var expected = new Project { Id = 1000, Name = "Project1" };
var actual = projectRepository.GetByName(expected.Name);
Assert.AreEqual<Project>(expected, actual);
}
Mais quand je lance le test de l'unité, il échoue lorsque l'on compare le type des deux objets avec l'erreur suivante:
Affirmer.AreEqual a échoué. Prévu:<MyProject.NHibernate.Projet>.
Réel:<MyProject.NHibernate.Projet>.
Pourquoi, c'est l'affirmation défaut?
N'est pas Affirmer.AreEqual affirmant que sur les propriétés des objets?
Selon la documentation:
Affirmer.AreEqual Méthode (Object, Object)
Vérifie que les deux objets spécifiés sont égaux. L'assertion échoue si
les objets ne sont pas égaux.Affirmer.AreSame Méthode
Vérifie que l'objet spécifié variables font référence au même objet.
source d'informationauteur Schaliasos
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de redéfinir la méthode equals pour tester l'égalité. Par défaut, il utilisera référence de comparaison, et depuis votre prévus et réels objets sont dans des endroits différents dans la mémoire, il échouera. Voici ce que vous devriez essayer:
Vous pouvez aussi consulter les les lignes directrices de remplacement est égal à sur MSDN.
Assurez-vous que votre
Project
classe substitue la méthode equals. Actuellement, vous sont en comparant les références de l'objet, et puisque vous avez 2 objets différents deProject
votreAssert.AreEqual()
échouera.Avec la méthode equals en place, vous pouvez utiliser le
Assert.AreEqual
PS: Si vous écrasez est Égal, c'est conseillé aussi remplacer le Hashcode.
AreSame vs AreEqual
Assert.AreSame
échouera toujours, même lorsque vous remplacez laEquals
méthode. Cette méthode fait vérifie si les références pointent vers la même instance. Qui, dans votre cas, ils ne seront pas.Assert.AreEqual
sera simplement de vérifier si les objets sont égaux, ce qui sera fait en appelantexpected.Equals(actual)
. Ce sera le résultat en vrai une fois que vous avez mis en œuvre leoverride bool Equals()
méthode.De la comparaison de deux objets différents qui ont les mêmes données. Vous devriez surcharge de la méthode Equals dans votre Projet de classe, et de mettre en œuvre la comparaison par id.
Une solution simple serait celui-ci: