9
votes

Test de l'unité passe lors de la débogage mais échoue lors de la course

Une méthode de recherche renvoie tous les articles correspondants et les articles de non-correspondance les plus récents jusqu'à un numéro spécifié.

Avant d'être renvoyé, la propriété Ismatch des articles correspondants est définie sur true comme suit: P>

articles = matchingArticles.Sélectionnez (c => {C.Amatch = TRUE; retournement c;}). Tolist (); P>

dans un test de cette méthode, P>

    [Test]
    public void SearchForArticle1Returns1MatchingArticleFirstInTheList()
    {
        using (var session = _sessionFactory.OpenSession())
        {
            var maxResults = 10;
            var searchPhrase = "Article1";
            IArticleRepository articleRepository = new ArticleRepository(session);
            var articles = articleRepository.GetSearchResultSet(searchPhrase, maxResults);
            Assert.AreEqual(10, articles.Count);
            Assert.AreEqual(1, articles.Where(a => a.Title.Contains(searchPhrase)).Count());
            var article = articles[0];
            Assert.IsTrue(article.Title.Contains(searchPhrase));
            Assert.IsTrue(article.IsMatch);
        }
    }


7 commentaires

Je suis un peu confus par les chèques de comptage == 10 et comptez == 1, puis vous choisissez arbitrairement des articles [0]. Combien de contrôle y a-t-il sur l'ordre des articles?


Comme @henk Holterman a dit que vous devriez probablement filtrer l'endroit où il contient de la rechercheRhrase, puis obtenir le premier


@Henk Holterman, @oskar Kjellin merci d'avoir cherché. L'article correspondant est d'abord dans la liste, qui est pris en charge dans la méthode du référentiel et testé ailleurs. Cependant, si je le fais comme vous le suggère: // var # article = Articles [0]; Var Article = Articles.Lower (A => A.TITLE.Contains (SearchPhrase)). Tolist () [0]; Assert.istrue (article.title.contains (SearchPhrase)); Assert.istrue (article.aShaque); le résultat est le même.


@Pones lorsque vous dites lorsque le test est exécuté dans la version - Avez-vous voulu dire que ou simplement lorsqu'il n'est pas débogué le test?


@Oskar Kjellin, l'assertion finale: assert.Irue (article.Amatch); @wal, je veux dire quand ne pas déboguer le test - il suffit de courir avec RE # ER.


@Pones il est impossible de répondre avec le code donné, nous avons besoin de plus de code du représentant


@Oskar Kjellin - mise à jour avec des méthodes de repo, comme indiqué les articles correspondants ont leur propriété Ismatch définie sur true par: correspondanceArticles.select (c => {C.Amatch = vrai; retournement c;}). Tolist ();


3 Réponses :


11
votes

PTONES, vous avez depuis précisé que le test de l'unité échoue lorsqu'il n'est pas débogué.

À ce stade, cela pourrait être tout ce que vous devriez continuer à exécuter le test de l'unité de ne pas déboguer et insérer la déclaration suivante quelque part que vous savez (ou pensez Vous savez) est VRAI P>

 if(condition)
            Debugger.Launch();


8 commentaires

Lorsque je courais comme suggéré et examine la propriété Ismatch de l'article est faux. Donc, l'affirmation échoue. Si je répète dans le débogage, la propriété Ismatch est vraie.


Avez-vous essayé de débogger.launch () lorsque vous ne courez pas sous le débogage?


Oui. Quand j'ai fait, j'ai pu examiner la propriété Ismatch et c'était faux.


Ok, qu'en est-il de cette ligne? Renvoyer des matchingArticles.Sélectionnez (c => {C.Amatch = TRUE; retournement c;}). Tolist () ;; (extraire la valeur de retour à une variable avant de renvoyer afin que vous puissiez inspecter)


var articles = correspondanceArticles.Sélectionnez (C => {C.Amatch = TRUE; retournement c;}). Tolist (); articles de retour; Si je lance le débogueur avant que cette ligne soit exécutée, puis inspectez les articles qu'ils ont tous une propriété iSmatch == et, finalement, le test passe. Si je lance le débogueur, cela est exécuté et inspectez les articles retournés, la propriété Ismatch est fausse.


Ok, alors vous l'avez réduit quelque peu. Vous devez maintenant forer plus loin. Peut-être élargir la déclaration de plus ou réécrire de ne pas utiliser d'instruction . Que diriez-vous de l'ensemble ismatch ? Je devine seulement - vous avez maintenant quelque chose à suivre car vous savez que la liste des articles ne doit contenir aucun ISMatch = false lorsque vous venez de les attribuer à vrai.


J'ai compris quel est le problème. C'est essentiellement une condition de race. Lorsque je confectionne les tests, je dépose la table de base de données, le recréant et la remplissage des données de test. Étant donné que la recherche s'appuie sur la recherche de texte complète, je crée un index de texte sur les colonnes correspondantes et la définition pour la population automatique. Lorsque cela est exécuté en débogage, il semble suffisamment de temps pour remplir l'index de texte et la requête de recherche renvoie les correspondances. Lorsque j'exécute le test, je ne pense pas que l'index a été renseigné à temps, aucun match n'est renvoyé et le test échoue. C'est Simlar à des problèmes avec DateTimes.


Heureux que vous ayez trouvé cela. Envisagez de mettre à jour votre question initiale avec vos conclusions et / ou upvotez / acceptant les commentaires ou les réponses qui vous ont aidé à résoudre votre problème.



0
votes

Essayez de Imprimer Le résultat réel que vous les comparez auxquels vous les comparez à des Déboges et exécuter normal

Dans mon cas, J'ai créé des entités (JBA) dans la méthode de test

dans Débogou , le IDS générées étaient 1, 2 et 3

Mais dans le mode exécutant normal , ils utilisent différent

qui a causé mes valeurs codées pour effectuer l'échec du test, alors je les ai modifiées pour obtenir une pièce d'identité à partir de l'entité au lieu de la manière codée dure

J'espère que cela aide


0 commentaires

0
votes

Évidemment, le problème sera différent pour les autres utilisateurs, mais je viens de le frapper et que je fisais ma solution peut aider certains. Fondamentalement, lorsque vous exécutez en mode de débogage, vous utilisez un seul test uniquement. Lorsque vous exécutez en mode Exécution, vous exécutez plusieurs tests en plus de celui que vous avez un problème avec.

Dans ma situation, le problème était que ces autres tests écrivent à une liste mondiale que je n'étais pas explicitement effacée dans ma configuration de test. J'ai corrigé le problème en supprimant la liste au début du test.

Mes conseils pour voir si c'est le type de problème que vous êtes confronté serait de désactiver tous les autres tests et que vous seul «gérer» le test que vous avez un problème avec. Si cela fonctionne lorsque cela fonctionne en soi, mais pas avec les autres, vous saurez que vous avez une dépendance entre les tests.

Un autre conseil consiste à utiliser console.writeline ("test") des instructions dans le test. C'est en fait comment j'ai trouvé ma liste avait des éléments avec le reste d'un autre test.


0 commentaires