2009-06-15 6 views
1

Nous venons de séparer nos adaptateurs de base de données SQL Server pour tenir compte des différences entre SQL Server 2000 et 2005, en particulier le type de données nvarchar (max). Comme le changement de code est si petit, au lieu de réimplémenter nos interfaces d'adaptateur et notre classe de base abstraite, j'ai sous-classé l'adaptateur SQL 2005 à partir de SQL 2000 et je viens de surcharger les méthodes et les propriétés appropriées.Comment exclure des ancêtres lors de l'appel de Assert.IsInstanceOfType?

public abstract class SqlDatabaseAdapter : DatabaseAdapter, ISqlDatabaseAdapter 
... 
public class Sql2000DatabaseAdapter : SqlDatabaseAdapter 
... 
public class Sql2005DatabaseAdapter : Sql2000DatabaseAdapter 
... 

Notre code de test unitaire précédemment juste jeté à un type particulier de l'adaptateur, puis a fait une affirmation contre ce type, mais maintenant que nous avons une méthode de fabrication de l'adaptateur pour construire l'adaptateur approprié SQL Server (de configuration ou trouvé via la connexion SQL), je veux vérifier que le type exact est instancié (puisque nous avons maintenant par défaut SQL Server 2005), le seul problème est que nos anciens tests passent quand ils devraient échouer :)

Dans l'exemple ci-dessous , la fabrique d'entités crée un Sql2005DatabaseAdapter, mais le test réussit car ce type hérite de Sql2000Databas eAdapter. Et cela fonctionne aussi plus haut dans la chaîne des ancêtres.

Entity foo = EntityFactory.Create("foo"); 
Assert.IsInstanceOfType(typeof(SqlDatabaseAdapter), foo.Adapter); // Should fail for test 
Assert.IsInstanceOfType(typeof(Sql2000DatabaseAdapter), foo.Adapter); // Should fail for test 
Assert.IsInstanceOfType(typeof(Sql2005DatabaseAdapter), foo.Adapter); // Should pass 

Je comprends pourquoi il passe, et je peux utiliser la méthode Assert.AreEqual générale pour résoudre ce cas particulier.

Assert.AreEqual(typeof(Sql2005DatabaseAdapter), foo.Adapter.GetType()); 

Mais je suis curieux de savoir s'il existe un moyen d'utiliser Assert.IsInstanceOfType?

Répondre

3

Depuis votre Sql2005DatabaseAdapter probablement ne peut pas fonctionner avec un serveur SQL 2000, la relation d'héritage est tout simplement faux, car il dit effectivement « Sql2005DatabaseAdapterest unSql2000DatabaseAdapter », ce qui conduit à toutes sortes de bizarreries, comme le problème que vous êtes rencontrer dans votre test.

Si vous voulez éviter cela, il serait bon de se déplacer la plupart des fonctionnalités dans une classe de base abstraite et ont tous deux héritent directement de cette:

public abstract class SqlDatabaseAdapter : DatabaseAdapter, ISqlDatabaseAdapter 
... 
public class Sql2000DatabaseAdapter : SqlDatabaseAdapter 
... 
public class Sql2005DatabaseAdapter : SqlDatabaseAdapter 
... 
+0

Bien sûr!Merci David, je suppose que j'étais trop rapide pour commencer à coder et que je n'ai pas passé assez de temps à penser aux relations. – si618

2

Je soupçonne que vous vous connaissez déjà la réponse ici, vous n'aimez pas :)

En disant Sql2005DatabaseAdapter : Sql2000DatabaseAdapter, vous dites que toute instance de Sql2005DatabaseAdapterest absolument un Sql2000DatabaseAdapter. Donc, en demandant que Assert.IsInstanceOfType prétend en quelque sorte que ce n'est pas ... sûrement ne va pas travailler.

Vous avez correctement donné un moyen de tester le type exact - pourquoi ne pas l'utiliser?

éditer Je voulais aussi dire quelque chose de similaire à ce que David Schmitt a - cette hiérarchie d'héritage se sent mal. Il n'est pas vraiment vrai de dire (en parlant des concepts du monde réel) qu'un Sql2005DatabaseAdapterEST un Sql2000DatabaseAdapter, est-ce?

+0

Je ne tombe pas de ce problème à nouveau :) Sérieusement, c'était seulement parce que nous n'avions pas de méthode d'usine et que nous lancions contre un type spécifique que j'ai trouvé le problème avec nos tests (parce que j'étais en train de refactoriser le type spécifique). – si618