Je dois tester une classe dont la valeur de retour dépend des valeurs d'une base de données. Je pourrais juste frapper la base de données dans le test unitaire mais ces valeurs pourraient changer. Existe-t-il une solution standard à cela?Utilisation de MBUnit pour tester des valeurs dans une base de données
Répondre
La réponse standard consiste à redéfinir votre classe afin que vous puissiez simuler la dépendance. Ceci est généralement fait en injectant votre source de données en tant qu'interface dans votre classe.
par exemple. Vous pouvez avoir une classe qui agit comme ci-dessous
class John
{
public John() { }
public void Load()
{
// call to db in here e.g SQLCommand
}
}
charge dépend du SQLCommand de sorte que vous aurez toujours besoin d'appeler un db pour cette
Si vous injectez une interface DataSource vous avez plus de flexibilité
par exemple
class John
{ IDataSource _db;
public John(IDataSource db)
{
_db = db;
}
public void Load()
{
_db.Load("John"); // IDataSource can now be either SQL
//or hardcoded or what ever much easier to test
}
}
Maintenant, si vous ne pouvez pas/ne fera pas que vous devez traiter ce test comme un test d'intégration. Que diriez-vous de mettre en place des données pour cela. par exemple. insérez la ligne que vous voulez lire. Retournez ensuite les données à leur état d'origine. L'inconvénient est que votre test sera lent et fragile.