2009-11-02 5 views
3

En utilisant NUnit et NMock2 je n'étais pas en mesure de comparer ce que je pensais étaient les mêmes SqlParameters:Comment SqlParameter test pour l'égalité

SqlParameter param1 = new SqlParameter("@Id", 1); 
SqlParameter param2 = new SqlParameter("@Id", 1); 
Assert.IsTrue(param1.Equals(param2)); // This failed 

je suis tombé sur ce problème, en essayant de tester l'exécution d'une méthode utilisant NMock2

[Test] 
    public void UpdateComments() 
    { 
     const int arbitraryId = 1; 
     Comment comment = new Comment(); 

     SqlParameter idParam = new SqlParameter("@ChangeId", arbitraryId); 

     Expect.Once.On(mockSqlDao).Method("ExecuteNonQuery") 
       .With("usp_Update_Comment", idParam); 

     changeDao.UpdateComment(arbitraryId, comment); 

     mocks.VerifyAllExpectationsHaveBeenMet(); 
    } 

J'ai reçu cette erreur:

NMock2.Internal.ExpectationException: unexpected invocation of sqlDao.ExecuteNonQuery("usp_Update_Comment",) Expected: 1 time: sqlDao.ExecuteNonQuery(equal to "usp_Update_Comment", equal to <@ChangeId>) [called 0 times]

questions:

  • Comment testez-vous avec NMock2 lorsque le paramètre attendu est SqlParameter?
  • Comment comparez-vous l'égalité de deux SqlParameters?
+1

Je suppose que SqlParameter.Equals est un test d'égalité objet, afin de ne pas vous définir ce que cela signifierait pour deux paramètres soient « égaux » dans un autre sens. Il y a beaucoup de champs dans le SqlParameter; S'il suffit que le nom de la colonne et la valeur correspondent, vous pouvez les tester directement. Je ne peux pas commenter sur NMock cependant. – Mikeb

+0

Je suspecte le NMock2 échoue parce qu'il voit le paramètre appelant comme différent du paramètre attendu. Je m'attendrais à ce que les autres propriétés de SqlParameter soient initialisées avec la même valeur par défaut. Cela peut ou peut ne pas être vrai. Également une note de côté ici plus d'informations sur l'appel de méthode; changeDao.Updatecomment (string proc, paramètres SqlParameter [] paramètres) ... – sgmeyer

Répondre

2

Parce que Equals() utilise l'implémentation par défaut de Equals pour autant que je sais (ce qui signifie qu'un SqlParameter ne « égal » un autre SqlParameter si elles sont le même objet), vous devrez interroger directement les propriétés du paramètre pour garantir que les données correctes sont transmises.

L'appel Has.Property dans .With vous permet de vérifier les propriétés d'un paramètre sans exiger qu'un paramètre soit égal à une autre valeur. Essayez ce qui suit:

Expect.Once.On(mockSqlDao).Method("ExecuteNonQuery") 
      .With("usp_Update_Comment", Has.Property("ParameterName").EqualTo("@Id") & 
             Has.Property("Value").EqualTo(1)); 
+0

Cela a fonctionné comme un charme! Je vous remercie! – sgmeyer

Questions connexes