Le test d'unité Assert.AreEqual a échoué
J'ai un test unitaire pour une méthode qui obtient un objet à partir d'une collection. Cela met en situation d'échec et je ne vois pas pourquoi, j'ai donc créé une épreuve très simple ci-dessous pour créer 2 fournisseur de l'objet et de test, ils sont égaux pour voir si je peux repérer le problème dans mon test de mon code. Mais ce test est de nouveau un échec. Quelqu'un peut-il voir ou d'expliquer pourquoi?
[TestMethod()]
public void GetSupplierTest2()
{
Supplier expected = new Supplier();
expected.SupplierID = 32532;
expected.SupplierName = "Test 1"
Supplier actual = new Supplier();
actual.SupplierID = 32532;
actual.SupplierName = "Test 1"
Assert.AreEqual(expected, actual);
}
Mais si j'ai tester les différentes propriétés des objets le test passe...
[TestMethod()]
public void GetSupplierTest2()
{
Supplier expected = new Supplier();
expected.SupplierID = 32532;
expected.SupplierName = "Test 1"
Supplier actual = new Supplier();
actual.SupplierID = 32532;
actual.SupplierName = "Test 1"
Assert.AreEqual(expected.SupplierID , actual.SupplierID );
Assert.AreEqual(expected.SupplierName , actual.SupplierName );
}
source d'informationauteur suggy1982
Vous devez vous connecter pour publier un commentaire.
Si vous voulez comparer deux instances différentes de Fournisseur, et que vous voulez qu'ils soient considérés comme égaux lorsque certaines propriétés ont la même valeur, vous devez remplacer la
Equals
méthode surSupplier
et de comparer les propriétés de la méthode.Vous pouvez en savoir plus sur la méthode Equals ici: http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx
Exemple de mise en œuvre:
Notez que vous aurez également un avertissement du compilateur que vous avez à mettre en œuvre GetHashCode ainsi, cela pourrait être aussi simple que cela:
Comme tous les autres répondre, dit le problème est que vous êtes en train de comparer les instances de
Supplier
[probablement] sans écraserEquals
méthode. Mais je ne pense pas que vous devriez remplacerEquals
à des fins de test car il peut affecter la production de code ou que vous mai besoin d'un autreEquals
logique dans le code de production.Au lieu de cela, vous devez soit faire valoir chaque membre un par un, comme vous le faites dans le premier échantillon (si vous n'avez pas beaucoup d'endroits où vous souhaitez comparer l'ensemble de l'objet) ou d'encapsuler cette logique de comparaison dans certains de la classe et de l'utilisation de cette classe:
//Code de Test:
Le défaut de mise en œuvre de
Object.Equals
pour les types de référence (ie. les classes) est "la Référence à l'Égalité": ce sont les deux objets de la même instance. Il n'est pas de comparer les valeurs des champs.Soit (comme d'autres l'ont montré) remplacer
Equals
pour donner de la "Valeur de l'Égalité". Dans ce caseyou doit également remplacerGetHashCode
(afin de conteneurs de travail), et doit l'emporteroperator ==
.Sinon accepter que la plupart des entités devraient avoir la référence à l'égalité (deux fournisseurs avec le même nom ne sont pas toujours de la même organisation) et le fait d'utiliser les propriétés directement.
Vous comparez 2 les différentes instances du type de Fournisseur, c'est pourquoi Affirmer l'échec.
Si vous voulez un Fournisseur est égal à-dire (par leur Id) vous pouvez remplacer est Égal à méthode, ici très à plus de simpled exemple :D.
Lors de la vérification des propriétés individuelles, vous comparez la chaîne/valeurs entières. Ils sont égaux, et donc les tests passent.
Lors de l'essai d'objets parents, que de comparer les deux conteneur des structures de type Fournisseur - et même si ceux-ci peuvent tenir l'égalité des valeurs de propriété, ils ne sont pas égaux: Depuis que vous êtes à l'instanciation de deux objets séparés, ils ne se trouvent pas à la même adresse dans la mémoire.
/*
À l'égard de la controverse autour d'accéder aux champs privés dans les tests unitaires, je crois qu'il ne devrait jamais être utilisée, sauf si absolument nécessaire (c'est à dire le temps et les frais de gestion des problèmes).
*/