Question

Ceci est une question difficile parce que trop de gens utilisent Pex et grains de beauté ou donc je pense (même si Pex est un produit vraiment super - beaucoup mieux que tout autre outil de test unitaire)

J'ai un projet Données qui a un modèle très simple avec une seule entité (DBItem). J'ai aussi écrit un DBRepository dans ce projet, qui manipule ce modèle EF. Repository a une méthode appelée GetItems() qui retourne une liste d'éléments de la couche métier (BLItem) et ressemble à ceci (exemple simplifié):

public IList<BLItem> GetItems()
{
    using (var ctx = new EFContext("name=MyWebConfigConnectionName"))
    {
        DateTime limit = DateTime.Today.AddDays(-10);
        IList<DBItem> result = ctx.Items.Where(i => i.Changed > limit).ToList();
        return result.ConvertAll(i => i.ToBusinessObject());
    }
}

Alors maintenant, je voudrais créer quelques tests unitaires pour cette méthode particulière. J'utilise Pex & taupes . J'ai créé mes grains de beauté et les talons pour mon contexte de l'objet EF.

Je voudrais écrire des tests unitaires paramétrisée (je sais que je l'ai d'abord écrit mon code de production, mais je devais, car je teste Pex & taupes) que les tests que cette méthode retourne la liste valide des objets.

Ceci est ma classe de test:

[PexClass]
public class RepoTest
{
    [PexMethod]
    public void GetItemsTest(ObjectSet<DBItem> items)
    {
        MEFContext.ConstructorString = (@this, name) => {
             var mole = new SEFContext();
        };

        DBRepository repo = new DBRepository();
        IList<BLItem> result = repo.GetItems();

        IList<DBItem> manual = items.Where(i => i.Changed > DateTime.Today.AddDays(-10));

        if (result.Count != manual.Count)
        {
            throw new Exception();
        }
    }
}

Alors je lance Pex Explorations pour ce test unitaire paramétrisée particulier, mais je reçois une erreur de bornes de chemin dépassé . Pex commence le test en fournissant null à cette méthode d'essai (donc de items = null). Ce code, qui est en cours d'exécution Pex:

[Test]
[PexGeneratedBy(typeof(RepoTest))]
[Ignore("the test state was: path bounds exceeded")]
public void DBRepository_GetTasks22301()
{
    this.GetItemsTest((ObjectSet<DBItem>)null);
}

Ce commentaire a été fourni par Pex supplémentaire:

  

Le cas de test a couru trop longtemps pour ces entrées et Pex a arrêté l'analyse. S'il vous plaît avis: La méthode Oblivious.Data.Test.Repositories.TaskRepositoryTest.b__0 a été appelé 50 fois; s'il vous plaît vérifier que le code ne soit pas bloqué dans une boucle infinie ou récursivité. Sinon, cliquez sur 'Set MaxStack = 200', et exécutez Pex à nouveau.

     

attribut Update [PexMethod (MaxStack = 200)]

Question

Suis-je le faire de manière correcte ou non? Dois-je utiliser à la place stub EFContext? Dois-je ajouter des attributs supplémentaires à la méthode de test afin hôte taupes en cours d'exécution (je ne suis pas sûr qu'il le fait maintenant). Je suis en tout Pex et taupes. Aucun test VS ou nUnit ou quoi que ce soit d'autre.

Je suppose que je devrais probablement mettre une limite à Pex le nombre d'articles devrait-il fournir pour cette méthode d'essai particulier.

Était-ce utile?

La solution

Moles n'a pas été conçu pour tester les parties de votre application qui ont des dépendances externes (par exemple d'accès aux fichiers, accès réseau, l'accès à la base de données, etc.). Au lieu de cela, les taupes vous permet de se moquer de ces parties de votre application pour cette façon vous pouvez faire des tests unitaires vrai sur les parties qui ne sont pas des dépendances externes.

Je pense que vous devriez juste se moquer de vos objets EF et des requêtes, par exemple, en créant des listes en mémoire et ayant des méthodes d'interrogation renvoient des données de faux à partir de ces listes en fonction de tout critère est pertinent.

Autres conseils

Je ne suis prise en main avec PEX aussi ... mes questions me entouraient vouloir utiliser moq;)

de toute façon ...

J'ai des méthodes similaires à votre qui ont le même problème. Quand j'augmenté au maximum, ils sont partis. On peut supposer que Pex convaincu qu'il avait suffisamment exploré les branches. J'ai des méthodes où j'ai dû augmenter le délai d'attente sur la validation du contrat de code aussi.

Une chose que vous devriez probablement passer est bien Faire des dans tous les objets dépendants comme paramètres ... ie Do not instancier les prises en pension dans la méthode, mais le transmettre dans.

Un problème général que vous avez est que vous instanciation gros objets dans votre méthode. Je fais la même chose dans mes classes de DAL, mais je ne suis pas tryign pour les tests unitaires dans l'isolement. Je construis des ensembles de données et l'utiliser pour tester mon code d'accès aux données contre.

J'utilise PEX sur ma logique métier et les objets.

Si je devais essayer de tester mon code DAL id doivent utiliser du CIO pour passer le datacontext dans les méthodes - qui serait alors faire ce test possible que vous pouvez railler le contexte de données.

Vous devez utiliser modèle Entity Framework Repository: http://www.codeproject.com/ KB / base de données / ImplRepositoryPatternEF.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top