10
votes

Nunit Test Bug? Attendu mais était

public class Dollar
{
    private int amount;

    public Dollar(int amount)
    {
        this.amount = amount;
    }

    public Dollar times(int multiplier)
    {
        return new Dollar(amount * multiplier);
    }

    public bool equals(Object theObject)
    {
       Dollar dollar = (Dollar) theObject;

       return amount == dollar.amount;
    }
}

2 commentaires

Mis à part: pourquoi ne mettez-vous pas en œuvre surcharge de l'opérateur?


On dirait que cela pourrait être une question de la version de l'Assemblée; Est-il possible que vous ayez deux versions de l'Assemblée qui implémentent tddbooks.dollar chargé?


5 Réponses :


11
votes

Le assert.Areequals utilisera la méthode Equals pour tester l'égalité. Au lieu de remplacer objet.equals le type dollar définit simplement un nouveau égale méthode qui ne participe pas à l'égalité des objets .NET. Il n'est donc pas utilisé et le test utilise l'égalité de référence qui échoue. Pour résoudre ce problème, vous devez remplacer la méthode objet.equales xxx


0 commentaires

0
votes

Il y a quelques choses:

  1. Vous avez défini une nouvelle méthode égale , au lieu de remplacer la méthode de la classe de base égale . Basculer pour remplacer et Nunit appellera votre méthode.
  2. Nunit imprime l'objet à l'aide de son TOSTRING et la mise en œuvre par défaut de Tostring consiste simplement à imprimer le nom de la classe. Remplacer Tostring Pour imprimer le montant et le message d'affirmation fera beaucoup plus de sens.

0 commentaires

5
votes

Nunit affiche la représentation des chaînes d'objets. Afin d'avoir une sortie pratique, vous devriez remplacer tostring code> méthode de dollar code> Classe: xxx pré>

La sortie sera la suivante: p >

public override int GetHashCode()
{
  return amount.GetHashCode();
}


1 commentaires

De plus, si vous prévoyez de ne pas dériver de la classe dollar , envisagez de le faire scellé . Si vous ne le faites pas scellé , envisagez de dire si (gettype ()! = Autre.getType ()) Renvoyer false; à l'intérieur du est égal à > méthode. Sinon, vous pouvez obtenir un mauvais résultat si autre est un dollar d'un type plus dérivé, comme un DescriptionDollar .



0
votes

Qu'est-ce que vous affirmez qu'il y a que nouveau dollar (10) est le même objet que celui cinq.time (2) retourne, ce qui n'est pas vrai. < p> Si vous souhaitez affirmer de cette façon, vous devez surcharger la méthode des égaux dans votre classe dollar comme ceci: xxx

Vous n'utilisez pas le remplacement mot-clé dans votre est égal à méthode.


0 commentaires

0
votes

La meilleure solution a déjà été donnée par quelques personnes, mais une alternative susceptible de fonctionner dans d'autres situations. Vous auriez besoin d'ajouter un getter pour le champ code> code> comme: xxx pré>

puis lorsque vous faites le test de l'unité, il ressemblerait à: P >

Assert.AreEqual(10, five.times(2).Amount);


0 commentaires